一、工厂方法模式介绍
工厂方法模式定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
二、工厂方法模式例子
披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza或是伦敦的奶酪pizza、伦敦的胡椒pizza。
使用工厂方法模式来完成披萨项目新的需求,将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。类图如下所示:
代码如下所示:
1)创建Pizza类及其子类
public abstract class Pizza{
private String name;
public void setName(String name){
this.name = name;
}
//准备原材料,不同的披萨所需的原材料不一样,因此做成抽象方法
public abstract void prepare();
public void bake(){
System.out.println(name + " is backing...");
}
public void cut(){
System.out.println(name + " is cutting...");
}
public void box(){
System.out.println(name + " is boxing...");
}
}
public class BJCheesePizza extends Pizza{
public void prepare(){
System.out.println("北京奶酪披萨准备原材料中...");
}
}
public class BJPepperPizza extends Pizza{
public void prepare(){
System.out.println("北京胡椒披萨准备原材料中...");
}
}
public class LDCheesePizza extends Pizza{
public void prepare(){
System.out.println("伦敦奶酪披萨准备原材料中...");
}
}
public class LDPepperPizza extends Pizza{
public void prepare(){
System.out.println("伦敦胡椒披萨准备原材料中...");
}
}
2)创建订购披萨类及其子类
//订购披萨类父类
public abstract class OrderPizza{
//定义一个抽象方法,让各个工厂子类去实现
public abstract Pizza createPizza(String type);
public void orderPizza(){
Pizza pizza = null;
String type;
do{
type = getType();
//抽象方法,由子类去实现
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
} while(true);
}
//获取客户希望订购的披萨种类
private String getType(){
try{
BufferReader reader = new BufferReader(new InputStreamReader(System.in));
System.out.print("input pizza type:");
String type = reader.readLine();
return type;
} catch(IOException e){
return "";
}
}
}
public class BJOrderPizza extends OrderPizza{
public Pizza createPizza(String type){
Pizza pizza = null;
if("cheese".equals(type)){
pizza = new BJCheesePizza();
} else if("pepper".equals(type)){
pizza = new BJPepperPizza();
}
return pizza;
}
}
public class LDOrderPizza extends OrderPizza{
public Pizza createPizza(String type){
Pizza pizza = null;
if("cheese".equals(type)){
pizza = new LDCheesePizza();
} else if("pepper".equals(type)){
pizza = new LDPepperPizza();
}
return pizza;
}
}