前提假设:现在有一个新开的奶茶店Store
,只能制作一种奶茶。
1 2 3 4 5 6
| public class MilkTea{ public void prepare(){ System.out.println("制作奶茶"); } }
|
1 2 3 4 5 6 7 8
| public class Store { public MilkTea createMilkTea(){ MilkTea milkTea = new MilkTea(); milkTea.prepare(); return milkTea; } }
|
奶茶店的生意越来越好,老板决定推出几种新口味的奶茶
将MilkTea
类设置为抽象类
1 2 3 4 5
| public abstract class MilkTea { public void prepare() { } }
|
创建LemonMilkTea
和AppleMilkTea
两个类
1 2 3 4 5 6 7
| public class LemonMilkTea extends MilkTea{ @Override public void prepare() { System.out.println("制作柠檬奶茶"); } }
|
1 2 3 4 5 6 7
| public class AppleMilkTea extends MilkTea{ @Override public void prepare() { System.out.println("制作苹果奶茶"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Store { public MilkTea createMilkTea(String type) { MilkTea milkTea = null; if (type.equals("lemon")) { milkTea = new LemonMilkTea(); } else if (type.equals("apple")) { milkTea = new AppleMilkTea(); } milkTea.prepare(); return milkTea; } }
|
现在复杂的场景来了,随着业务的发展,有的口味不受用户喜欢,销量惨淡,老板要将这些口味的奶茶砍掉,并且重新创造新的口味,于是在原来的createMilkTea
方法中需要不断的重复添加和删除if-else
语句,并且可能在Store
的业务中不仅仅只有createNilkTea
一个方法,其他的方法也可能会包含上述的大量if-else
添加删除操作,所以需要将创造milkTea
的代码抽离出来,用另外一个对象来进行操控,这个对象就可以称之为“工厂”。
创建工厂SimpleFactory.java
1 2 3 4 5 6 7 8 9 10 11
| public class SimpleFactory { public MilkTea createMilkTea(String type) { MilkTea milkTea = null; if (type.equals("lemon")) { milkTea = new LemonMilkTea(); } else if (type.equals("apple")) { milkTea = new AppleMilkTea(); } return milkTea; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Store { SimpleFactory factory;
public Store(SimpleFactory factory) { this.factory = factory; }
public MilkTea createMilkTea(String type) { MilkTea milkTea = factory.createMilkTea(type); milkTea.prepare(); return milkTea; } }
|
简单工厂其实不是一个设计模式,反而像是一种编程习惯。
参考书籍:Head First设计模式第四章“烘烤OO的精华:工厂模式”