【工厂模式】 定义了创建对象的接口,由子类决定实例化具体的对象。工厂模式让一个类把实例化的工作延迟到子类进行。
下面是一个具体的例子,用PizzaStore来展示了工厂模式的使用。从类图中我们可以看出,PizzaStore扮演着Creator的角色,Pizza扮演着Product的角色,这两个类都是抽象类。具体的Product定义在Pizza的子类中,由PizzaStore的子类决定如何创建。
[img]http://zzuwxf.iteye.com/upload/attachment/64332/d338afb3-22f1-3500-be35-265fbd26c64a.jpg[/img]
(1) PizzaStore (抽象的Creator,对接口编程,而不对实现编程,非常灵活)
public abstract class PizzaStore {
public Pizza orderPizza(PizzaType type){
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(PizzaType type);
}
(2) Pizza (抽象的Product)
public abstract class Pizza {
protected String name;
protected String dough;
protected String sauce;
public void prepare(){...}
public void bake(){...}
public void cut(){...}
public void box(){...}
public String getName(){
return name;
}
}
(3) NYStyleCheesePizza (具体的Product)
public class NYStyleCheesePizza extends Pizza{
public NYStyleCheesePizza(){
name = "NY Style Sauce and Cheese Pizza";
dough = "Thin Crust Dough";
sauce = "Marinare Sacue";
}
}
(4) NYStylePizzaStore (具体的Factory,根据类型来生成具体的产品)
public class NYStylePizzaStore extends PizzaStore{
public Pizza createPizza(PizzaType type){
if(type.equals(PizzaType.CHEESE)){
return new NYStyleCheesePizza();
}
return null;
}
}
下面是一个具体的例子,用PizzaStore来展示了工厂模式的使用。从类图中我们可以看出,PizzaStore扮演着Creator的角色,Pizza扮演着Product的角色,这两个类都是抽象类。具体的Product定义在Pizza的子类中,由PizzaStore的子类决定如何创建。
[img]http://zzuwxf.iteye.com/upload/attachment/64332/d338afb3-22f1-3500-be35-265fbd26c64a.jpg[/img]
(1) PizzaStore (抽象的Creator,对接口编程,而不对实现编程,非常灵活)
public abstract class PizzaStore {
public Pizza orderPizza(PizzaType type){
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(PizzaType type);
}
(2) Pizza (抽象的Product)
public abstract class Pizza {
protected String name;
protected String dough;
protected String sauce;
public void prepare(){...}
public void bake(){...}
public void cut(){...}
public void box(){...}
public String getName(){
return name;
}
}
(3) NYStyleCheesePizza (具体的Product)
public class NYStyleCheesePizza extends Pizza{
public NYStyleCheesePizza(){
name = "NY Style Sauce and Cheese Pizza";
dough = "Thin Crust Dough";
sauce = "Marinare Sacue";
}
}
(4) NYStylePizzaStore (具体的Factory,根据类型来生成具体的产品)
public class NYStylePizzaStore extends PizzaStore{
public Pizza createPizza(PizzaType type){
if(type.equals(PizzaType.CHEESE)){
return new NYStyleCheesePizza();
}
return null;
}
}