Java使用抽象工厂模式实现的肯德基消费案例详解

网友投稿 252 2023-08-03

Java使用抽象工厂模式实现的肯德基消费案例详解

本文实例讲述了java使用抽象工厂模式实现的肯德基消费案例。分享给大家供大家参考,具体如下:

一、模式定义

抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。

抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。

二、模式举例

1 模式分析

我们借用爸爸和儿子到肯德基店消费这一场景来说明这一模式,进行抽象分析后的截图如下

2 抽象工厂模式的静态建模

3 代码示例

3.1 抽象食物的建立

抽象食物——AbstractBaseFood

package com.demo.factory.model;

/**

*

* 食物基类

*

* @author maofw

*

*/

public abstract class AbstractBaseFood

{

// 类别

protected String kind;

// 数量

protected int num;

// 价格

protected float price;

// 合计

public float totalPrice()

{

return this.num * this.price;

}

}

食物接口——IFood

package com.demo.factory.model;

/**

* 抽象食物接口

*

* @author maofw

*

*/

public interface IFood

{

/**

* 打印输出食物信息

*/

void printMesage();

}

3.2 建立不同食物的抽象基类

汉堡基类——Hamburg

package com.demo.factory.model;

/**

* 汉堡基类

*

* @author maofw

*

*/

public abstract class Hamburg extends AbstractBaseFood implements IFood

{

public void printMesage()

{

System.out.println("--" + this.kind + "风味汉堡,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());

}

}

鸡翅基类——ChickenWings

package com.demo.factory.model;

/**

* 鸡翅基类

*

* @author maofw

*

*/

public abstract class ChickenWings extends AbstractBaseFood implements IFood

{

public void printMesage()

{

System.out.println("--" + this.kind + "风味鸡翅,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());

}

}

薯条基类——FrenchFries

package com.demo.factory.model;

/**

* 薯条基类

*

* @author maofw

*

*/

public abstract class FrenchFries extends AbstractBaseFood implements IFood

{

public void printMesage()

{

System.out.println("--" + this.kind + "风味薯条,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());

}

}

饮料基类——Beverage

package com.demo.factory.model;

/**

* 饮料基类

*

* @author maofw

*

*/

public abstract class Beverage extends AbstractBaseFood implements IFood

{

public void printMesage()

{

System.out.println("--" + this.kind + "饮料,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice());

}

}

3.3 创建具体的食物

麻辣鸡腿汉堡——ChinaHanburm

package com.demo.factory.model.kfc;

import com.demo.factory.model.Hamburg;

/**

* 中国风味的麻辣鸡腿汉堡

*

* @author maofw

*

*/

public class ChinaHanburm extends Hamburg

{

/**

* 构造方法

*

* @param kind

* @param price

* @param num

*/

public ChinaHanburm(int num)

{

this.kind = "麻辣";

this.price = 14.0f;

this.num = num;

}

}

奥尔良鸡翅——ChinaChickenWings

package com.demo.factory.model.kfc;

import com.demo.factory.model.ChickenWings;

/**

* 鸡翅实现类

*

* @author maofw

*

*/

public class ChinaChickenWings extends ChickenWings

{

public ChinaChickenWings(int num)

{

this.kind = "奥尔良";

this.price = 2.5f;

this.num = num;

}

}

薯条——ChinaFrenchFries

package com.demo.factory.model.kfc;

import com.demo.factory.model.FrenchFries;

/**

* 薯条实现类

*

* @author maofw

*

*/

public class ChinaFrenchFries extends FrenchFries

{

public ChinaFrenchFries(int num)

{

this.kind = "普通";

this.price = 8.0f;

this.num = num;

}

}

可乐——ChinaBeverage

package com.demo.factory.model.kfc;

import com.demo.factory.model.Beverage;

/**

* 饮料实现类

*

* @author maofw

*

*/

public class ChinaBeverage extends Beverage

{

public ChinaBeverage(int num)

{

this.kind = "可乐";

this.price = 7.0f;

this.num = num;

}

}

3.4 建立工厂

创建抽象肯德基工厂——IKfcFactory 生产抽象食物

package com.demo.factory.itf;

import com.demo.factory.model.Beverage;

import com.demo.factory.model.ChickenWings;

import com.demo.factory.model.FrenchFries;

import com.demo.factory.model.Hamburg;

/**

* 肯德基抽象工厂基类

*

* @author maofw

*

*/

public interface IKfcFactory

{

// 生产汉堡

public Hamburg createHamburg(ONBGQPHint num);

// 生产薯条

public FrenchFries createFrenchFries(int num);

// 生产鸡翅

public ChickenWings createChickenWings(int num);

// 生产饮料

public Beverage createBeverage(int num);

}

创建具体肯德基工厂——ChinaKfcFactory 生产具体食物

package com.demo.factory.itf;

import com.demo.factory.model.Beverage;

import com.demo.factory.model.ChickenWings;

import com.demo.factory.model.FrenchFries;

import com.demo.factory.model.Hamburg;

import com.demo.factory.model.kfc.ChinaBeverage;

import com.demo.factory.model.kfc.ChinaChickenWings;

import com.demo.factory.model.kfc.ChinaFrenchFries;

import com.demo.factory.model.kfc.ChinaHanburm;

public class ChinaKfcFactory implements IKfcFactory

{

// 生产可乐

public Beverage createBeverage(int num)

{

return new ChinaBeverage(num);

}

// 生产奥尔良烤鸡翅

public ChickenWings createChickenWings(int num)

{

return new ChinaChickenWings(num);

}

// 生产薯条

public FrenchFries createFrenchFries(int num)

{

return new ChinaFrenchFries(num);

}

// 生产麻辣风味鸡腿汉堡

public Hamburg createHamburg(int num)

{

return new ChinaHanburm(num);

}

}

3.5 创建客户类——Customer

package com.demo.factory.custom;

import com.demo.factory.itf.IKfcONBGQPHFactory;

import com.demo.factory.model.Beverage;

import com.demo.factory.model.ChickenWings;

import com.demo.factory.model.FrenchFries;

import com.demo.factory.model.Hamburg;

/**

* 客户类

*

* @auhttp://thor maofw

*

*/

public class Customer

{

// 抽象工厂

private IKfcFactory kfcFactory;

// 构造方法将抽象工厂作为参数传入

public Customer(IKfcFactory kfcFactory)

{

this.kfcFactory = kfcFactory;

}

/**

* 订购食物

*/

// 订购麻辣鸡腿汉堡

public float orderHamburg(int num)

{

// 获得麻辣鸡腿汉堡

Hamburg hamburg = kfcFactory.createHamburg(num);

// 输出订购信息

hamburg.printMesage();

// 返回总价

return hamburg.totalPrice();

}

// 订购奥尔良烤鸡翅

public float orderChickenWings(int num)

{

// 获得奥尔良烤鸡翅

ChickenWings chickenWings = kfcFactory.createChickenWings(num);

// 输出订购信息

chickenWings.printMesage();

// 返回总价

return chickenWings.totalPrice();

}

// 订购薯条

public float orderFrenchFries(int num)

{

// 获得薯条

FrenchFries frenchFries = kfcFactory.createFrenchFries(num);

// 输出订购信息

frenchFries.printMesage();

// 返回总价

return frenchFries.totalPrice();

}

// 订购可乐

public float orderBeverage(int num)

{

// 获得可乐

Beverage beverage = kfcFactory.createBeverage(num);

// 输出订购信息

beverage.printMesage();

// 返回总价

return beverage.totalPrice();

}

}

3.6 故事情节展现

package com.demo.factory;

import java.lang.management.ManagementFactory;

import java.net.HttpURLConnection;

import java.net.URL;

import java.net.URLConnection;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.text.NumberFormat;

import java.util.Arrays;

import java.util.Calendar;

import java.util.ResourceBundle;

import com.demo.factory.custom.Customer;

import com.demo.factory.itf.ChinaKfcFactory;

import com.demo.factory.itf.IKfcFactory;

public class MainApp

{

/**

* 主应用程序方法

*

* @param args

*/

public static void main(String[] args)

{

/**

* 定义一个肯德基(IKfcFactory类型)

*/

IKfcFactory kfcFactory = new ChinaKfcFactory();

/**

* 爸爸和儿子走进肯德基,准备点餐

*/

Customer customer = new Customer(kfcFactory);

/**

* 开始点餐

*/

// 一个麻辣鸡腿汉堡

float hamhurgMoney = customer.orderHamburg(1);

// 四个奥尔良烤鸡翅

float chickenWingsMoney = customer.orderChickenWings(4);

// 一包薯条

float frenchFriesMoney = customer.orderFrenchFries(1);

// 两杯可乐

float beverageMoney = customer.orderBeverage(2);

System.out.println("总计:" + (hamhurgMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney));

}

}

运行结果:

--麻辣风味汉堡, 单价:14.0, 数量:1, 合计:14.0

--奥尔良风味鸡翅, 单价:2.5, 数量:4, 合计:10.0

--普通风味薯条, 单价:8.0, 数量:1, 合计:8.0

--可乐饮料, 单价:7.0, 数量:2, 合计:14.0

总计:46.0

三、该模式的设计原则

1 多用对象组合,少用继承

2 针对抽象编程,不针对实现编程

3 产品对象通过工厂暴露的方法创建

四、使用场合

1 创建产品家族,相关产品集合在一起使用的时候;

2 想要提供一个产品类库,并只想显示其接口而不是实现时;

3 通过组合的方式使用工厂时。

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring boot集成RabbitMQ的示例代码
下一篇:webpack4 css打包压缩问题的解决
相关文章

 发表评论

暂时没有评论,来抢沙发吧~