演进顺序:传统写法 —>简单工厂—>工厂方法—>抽象工厂
需求案例:
制作蛋糕
1.准备
2.烘焙
3.包装
4.配送
传统写法
- 定义抽象类
- 实现类继承抽象类
- 预定方法
- 客户端测试
- 分析
定义抽象类
/*** 蛋糕抽象类*/public abstract class AbstractCake {protected String name;public abstract void prepare();public void bake() {System.out.println(name + "烘焙;");}public void box() {System.out.println(name + "包装;");}public void send() {System.out.println(name + "配送;");}public void setName(String name) {this.name = name;}}
实现类继承抽象类
/*** 奶油蛋糕*/public class CreamCake extends AbstractCake{@Overridepublic void prepare() {System.out.println("原料:原胚、奶油");}}
/*** 水果蛋糕*/public class fruitCake extends AbstractCake{@Overridepublic void prepare() {System.out.println("原料:原胚、水果");}}
预定方法
/*** 预定方法*/public class OrderCake {public OrderCake() {AbstractCake cake;String orderType;do {orderType = getType();if (orderType.equals("水果")) {cake = new fruitCake(); // ===>耦合cake.setName(orderType+"蛋糕 ");} else if (orderType.equals("奶油")) {cake = new CreamCake(); // ===>耦合cake.setName(orderType+"蛋糕 ");} else {System.out.println("暂不支持的蛋糕类型");break;}//操作流程cake.prepare();cake.bake();cake.box();cake.send();} 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 "";}}}
客户端测试
/*** 客户端测试*/public class CakeStore {public static void main(String[] args) {new OrderCake();}}//测试结果请输入蛋糕类型:水果原料:原胚、水果水果蛋糕 烘焙;水果蛋糕 包装;水果蛋糕 配送;请输入蛋糕类型:巧克力暂不支持的蛋糕类型
分析:
如上代码可以看到:预定方法OrderCake在方法中直接new对应的实现类,此时上新新蛋糕类型,如:巧克力蛋糕,如果有orderCake1~n,则需要修改多个OrderCake方法,这违反了开闭原则。有没有什么好的方式只修改一处就可以实现全局修改呢?将创建对象依托给工厂去创建 ==》简单工厂模式

