一、概述
定义:工厂模式定义了一个创建产品对象的接口,由子类决定要实例化的是哪一个具体的产品类。工厂模式是代替new操作的一种模式。
类图:
工厂模式封装具体类型的实例化,抽象的Creator具有工厂方法,它的任何子类都要实现该方法,由这些子类负责创建实例。
二、具体例子
场景描述:一个做pizza的商家具有多家pizza连锁店,每个店都能生产pizza,为了讨好不同地区顾客的口味,同一名字的pizza做法也有差别。商店需要用同一套售卖系统。
根据描述,开始设计需要用到的类,需要一个PizzaStore(代表类图中的Creator), APizzaStore(代表ConcreteCreator,A地区的店),BpizzaStore(B地区的店),Pizza(代表Product)以及一些不同具体pizza类(代表ConcreteProduct)。
类图:
代码:
public class Pizza {
protected String name;
protected String dough; //面粉类型
protected String sauce; //调味酱汁
public void prepare() {
//做pizza的一些事前准备
}
public void bake() {
System.out.println("Bake for 25 minutes");
}
public void cut() {
System.out.println("Cutting the pizza");
}
public void box() {
System.out.println("Place pizza in box");
}
public String getName() {
return name;
}
}
public class ACheesePizza extends Pizza {
public ACheesePizza() {
name = "A area style Cheese Pizza"; //A地区风味的Cheese Pizza
dough = "xxx";
sauce = "yyy";
}
}
public class AClamPizza extends Pizza{
public AClamPizza() {
name = "A area style Clam Pizza"; //A地区风味的Clam Pizza
dough = "xxx";
sauce = "yyy";
}
}
public class BCheesePizza extends Pizza {
public BCheesePizza() {
name = "B area style Cheese Pizza"; //B地区风味的Cheese Pizza
dough = "xxx";
sauce = "yyy";
}
@Override
public void bake() {
System.out.println("Bake for 20 minutes"); //烤20分钟
}
}
public class BClamPizza extends Pizza {
public BClamPizza() {
name = "B area style Clam Pizza"; //B地区风味的Clam Pizza
dough = "xxx";
sauce = "yyy";
}
}
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type); //工厂方法
}
public class APizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new ACheesePizza();
} else if (type.equals("clam")) {
return new AClamPizza();
}
return null;
}
}
public class BPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
if (type.equals("cheese")) {
return new BCheesePizza();
} else if (type.equals("clam")) {
return new BClamPizza();
}
return null;
}
}
运行:
public static void main(String[] args) {
PizzaStore aPizzaStore = new APizzaStore();
PizzaStore bPizzaStore = new BPizzaStore();
Pizza aCheesePizza = aPizzaStore.orderPizza("clam");
System.out.println("name : " + aCheesePizza.getName() + "\n");
Pizza bClamPizza = bPizzaStore.orderPizza("cheese");
System.out.println("name : "+ bClamPizza.getName() + "\n");
}