抽象工厂模式
- 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类
- 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
- 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
将工厂抽象成两层, AbsFactory( 抽象工厂 ) 和 具体实现的工厂子类。可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
分析实现步骤
类图

创建抽象类(不变)
- 创建地域特色的产品类
- 创建接口抽象工厂
- 创建具体实现抽象工厂的子类工厂
- 预定类实现
- 客户端测试
-
代码实现
创建接口抽象工厂
/*** 抽象工厂模式的抽象层(接口)*/public interface AbstractFactory {//让子类工厂来具体实现public AbstractCake createCake(String orderType);}
创建具体实现抽象工厂的子类工厂
/*** (中国)工厂实现类*/public class CNFactory implements AbstractFactory{@Overridepublic AbstractCake createCake(String orderType) {AbstractCake cake = null;if(orderType.equals("水果")){cake = new CNfruitCake();cake.setName(orderType + "蛋糕(中国味道)");}else if(orderType.equals("奶油")){cake = new CNCreamCake();cake.setName(orderType + "蛋糕(中国味道)");} else {System.out.println("暂不支持的蛋糕类型");return cake;}return cake;}}
/*** (美国)工厂实现类*/public class USFactory implements AbstractFactory{@Overridepublic AbstractCake createCake(String orderType) {AbstractCake cake = null;if(orderType.equals("水果")){cake = new CNfruitCake();cake.setName(orderType + "蛋糕(美国味道)");}else if(orderType.equals("奶油")){cake = new CNCreamCake();cake.setName(orderType + "蛋糕(美国味道)");} else {System.out.println("暂不支持的蛋糕类型");return cake;}return cake;}}
预定类实现
/*** 预定方法实现类*/public class OrderCake {AbstractFactory factory;public OrderCake( AbstractFactory factory){setFactory(factory);}private void setFactory(AbstractFactory factory) {String orderType;AbstractCake cake;do {orderType = getType();//获取简单(静态)工厂cake = factory.createCake(orderType);if(cake != null) {cake.prepare();cake.bake();cake.box();cake.send();} else {System.out.println("预定失败");break;}}while(true);}//输入蛋糕类型private String getType() {try {BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入蛋糕类型:");String str = strin.readLine();return str;} catch (IOException e) {e.printStackTrace();return "";}}}
客户端测试 ```java public class CakeStore {
public static void main(String[] args) {
//中国new OrderCake(new CNFactory());
} }
//测试结果
请输入蛋糕类型:
水果
原料:原胚、水果、中国元素
水果蛋糕(中国味道)烘焙;
水果蛋糕(中国味道)包装;
水果蛋糕(中国味道)配送;
请输入蛋糕类型:
测试
暂不支持的蛋糕类型
预定失败
```
分析
很精妙,待深入使用
