- 先由简单工厂,引出一系列问题,从而优化。
- 简单工厂模式属于创建型模式,是工厂模式的一种,简单工厂模式是由一个工厂对象决定创造出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
- 简单工厂模式: 定义了一个创建对象的类,由这个类来封装实例化对象的过程。
场景:用户使用OderPizza 下单不同的Pizza
/**
* 所有披萨的顶级父类
*/
abstract class Pizza {
protected String name;
/**
* 准备原材料,不同的Pizza原材料不一样,设置成抽象方法,留给子类重写
*/
public abstract void prepare();
public void bake() {
System.out.println(name + " 正在烘烤");
}
public void cut() {
System.out.println(name + " 正在剪切");
}
public void box() {
System.out.println(name + " 正在打包");
}
public Pizza setName(String name) {
this.name = name;
return this;
}
}
public class CheesePizza extends Pizza {
/**
* 准备原材料,不同的Pizza原材料不一样,
*/
@Override
public void prepare() {
System.out.println("准备芝士披萨的材料");
}
}
public class GreekPizza extends Pizza {
/**
* 准备原材料,不同的Pizza原材料不一样
*/
@Override
public void prepare() {
System.out.println("准备希腊风味披萨材料");
}
}
public class OderPizza {
public OderPizza() {
do {
Pizza pizza = null;
String orderType; // 类型
orderType = getType();
if (orderType.equals("CheesePizza")) {
pizza = new CheesePizza();
pizza.setName(orderType);
} else if (orderType.equals("GreekPizza")) {
pizza = new GreekPizza();
pizza.setName(orderType);
} else {
break;
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while (true);
}
public String getType() {
Scanner scanner = new Scanner(System.in);
return scanner.next();
}
}
问题所在
当我们想要新增一个其他类型的Pizza时候,我们需要在OderPizza 必须加一个if判断来制造该类型的Pizza,这样是违反了OCP原则的。
如果有多个OderPizza都在制作Pizza,那么需要修改的代码会很多。
修改后的代码
public class SimpleFactory {
public Pizza createPizza(String orderType) {
if ("CheesePizza".equals(orderType)) {
return new CheesePizza().setName(orderType);
} else if ("GreekPizza".equals(orderType)) {
return new GreekPizza().setName(orderType);
} else {
return null;
}
}
}
public class OrderPizza {
private SimpleFactory simpleFactory;
public void setSimpleFactory(SimpleFactory simpleFactory) {
this.simpleFactory = simpleFactory;
do {
Pizza pizza = simpleFactory.createPizza(getType());
if (pizza != null) {
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} else {
System.out.println("订购失败,请重试");
}
} while (true);
}
public String getType() {
Scanner scanner = new Scanner(System.in);
return scanner.next();
}
}
public class Main {
public static void main(String[] args) {
OrderPizza orderPizza = new OrderPizza();
orderPizza.setSimpleFactory(new SimpleFactory());
}
}