一、简单工厂模式
购买披萨的例子
1:不同披萨的从准备到打包出售的流程一致,只是准备阶段的材料不同,可把流程放到抽象类中,然后不同的pizza重写基类的prepare方法
public abstract class Pizza {
protected String name;
public void prepare() {
System.out.println("prepare--" + name);
}
public void bake() {
System.out.println("bake--" + name);
}
public void cut() {
System.out.println("cut--" + name);
}
public void pack() {
System.out.println("pack--" + name);
}
public void setName(String name) {
this.name = name;
}
}
public class CheesePizza extends Pizza{
@Override
public void prepare() {
System.out.println("Cheese Pizza ...start");
}
}
public class GreekPizza extends Pizza{
@Override
public void prepare() {
System.out.println("Greek Pizza ...start");
}
}
订单制作模块,根据客户订单类型不同,创建其对应的pizza
public class OrderPizza {
private String type;
public OrderPizza(String type) {
this.type = type;
Pizza pizza = null;
if (type == "cheese") {
pizza = new CheesePizza();
pizza.setName("cheese");
} else if (type == "greek") {
pizza = new GreekPizza();
pizza.setName("greek");
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.pack();
}
}
测试模块
public class PizzaStore {
public static void main(String[] args) {
OrderPizza orderPizza = new OrderPizza("cheese");
}
}
以上是简单的工厂模式,但是如果新增不同类型的pizza和不同产地的pizza,需要修改OrderPizza模块,不符合的设计模式的职责单一与开闭原则。
优化:
Pizza不做修改
OrderPizza 负责pizza制作流程,不做分类处理
public class OrderPizza {
IPizzaFactory iPizzaFactory;
public OrderPizza(IPizzaFactory iPizzaFactory, String type) {
this.iPizzaFactory = iPizzaFactory;
Pizza pizza = iPizzaFactory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.pack();
}
}
提供对外实现的方法
public interface IPizzaFactory {
public Pizza createPizza(String type);
}
不同产地的口味调度
public class LDPizza implements IPizzaFactory{
@Override
public Pizza createPizza(String type) {
if (type == "cheese") {
return new LDCheesePizza();
} else {
return new LDGreekPizza();
}
}
}
LDCheesePizza,LDGreekPizza 只需要修改prepare即可
public class LDCheesePizza extends Pizza{
@Override
public void prepare() {
super.setName("LD奶酪披萨");
System.out.println("LD奶酪披萨 Pizza ...start");
}
}
public class PizzaStore {
public static void main(String[] args) {
new OrderPizza(new BJPizza(), "cheese");
}
}