概述
工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推迟到子类。
工厂方法模式将工厂抽象起来,让其子类去实现。工厂方法模式可以比作:
生产 - 工厂 - 消费
每一个工厂有一个总部,分部的工厂就是实现类,每个实现类都有自己对应的生产类型
实例
- pizza的实现类,创建一个抽象类,另外还有继承了抽象类的具体pizza实现
- 定义一个抽象工厂,其定义了Pizza的生产接口,但不负责具体的Pizza生产,将生产任务交给不同的派生类Pizza工厂
- 定义一个商店订购对应的pizza
对应pizza抽象类
public abstract class Pizza {
protected String name;//具体的名字
public abstract void prepare();//准备原材料,不同的pizza是不一样的,这里可以继承
public void bake(){
System.out.println(name + "baking");
}
public void cut(){
System.out.println(name + "cutting");
}
public void box(){
System.out.println(name + "boxing");
}
public void setName(String name) {
this.name = name;
}
}
继承类
public class BJCheesePizza extends Pizza {
@Override
public void prepare() {
setName("北京奶酪披萨");
System.out.println("北京的奶酪披萨 准备原材料");
}
}
public class BJGreekPizza extends Pizza{
@Override
public void prepare() {
setName("北京Greek披萨");
System.out.println("北京Greek披萨 准备原材料");
}
}
public class LDCheesePizza extends Pizza{
@Override
public void prepare() {
setName("伦敦奶酪披萨");
System.out.println("伦敦的奶酪披萨 准备原材料");
}
}
public class LDGreekPizza extends Pizza{
@Override
public void prepare() {
setName("伦敦Greek披萨");
System.out.println("伦敦Greek披萨 准备原材料");
}
}
定义抽象类,规范生产Pizza的方法
public abstract class OrderPizza {
//定义一个抽象方法,createPizza,让各个工厂子类自己实现
abstract Pizza createPizza(String orderType);
//构造器
public OrderPizza(){
Pizza pizza = null;
String orderType;//订购披萨的类型
do{
orderType = getType();
pizza = createPizza(orderType);//抽象方法,有工厂子类实现
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
}while (true);
}
//获取Pizza类型
private String getType(){
Scanner scan = new Scanner(System.in);
String type = scan.next();
return type;
}
}
工厂的具体实现根据类型不同生产不同的Pizza,都继承抽象工厂类
public class BJOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new BJCheesePizza();
}else if(orderType.equals("greek")){
pizza = new BJGreekPizza();
}
return pizza;
}
}
public class LDOrderPizza extends OrderPizza {
@Override
Pizza createPizza(String orderType) {
Pizza pizza = null;
if(orderType.equals("cheese")){
pizza = new LDCheesePizza();
}else if(orderType.equals("greek")){
pizza = new LDGreekPizza();
}
return pizza;
}
}
订购pizza商店类,根据类型不同实现订购不同的pizza
public class OrderStore {
public static void main(String[] args) {
// new BJOrderPizza();
new LDOrderPizza();
}
}