工厂方法与抽象工厂结合(Pizza)

来源:互联网 发布:网络电视华人台 编辑:程序博客网 时间:2024/06/06 04:56

工厂方法和抽象工厂作用都是一样 : 解耦客户端代码,不用指定具体类就可产生具体对象.

摘自: Head First 设计模式


说一下大概意思

1. 在不指定具体类的情况下可产生具体披萨

2.不同区域可产生不同风味的披萨

3.同一区域可产生不同原料料理的披萨


首先我们来定义披萨

public abstract class Pizza {private PizzaCondimentFactory condimentFactory=null;public Pizza(PizzaCondimentFactory condimentFactory) {this.condimentFactory = condimentFactory;}public PizzaCondimentFactory getCondimentFactory() {return condimentFactory;}public void setCondimentFactory(PizzaCondimentFactory condimentFactory) {this.condimentFactory = condimentFactory;}/*** @Title: prepare * void * @throws* @Description: //准备.如原料的加工 */public abstract void prepare();/*** @Description: //烘烤* @Title: boke * void * @throws */public abstract void boke();/*** @Description: //切片* @Title: cut * void * @throws */public abstract void cut();/*** @Description: //装箱* @Title: box * void * @throws */public abstract void box();}

披萨的具体实现:

1.芝加哥烤肉披萨

public class ChigacoStyleBarbecuePizza extends Pizza {public ChigacoStyleBarbecuePizza(PizzaCondimentFactory condimentFactory) {super(condimentFactory);}@Overridepublic void prepare() {this.getCondimentFactory().prepare();}@Overridepublic void boke() {System.out.println("ChigacoStyleBarbecuePizza Boking!");}@Overridepublic void cut() {System.out.println("ChigacoStyleBarbecuePizza Cuting!");}@Overridepublic void box() {System.out.println("ChigacoStyleBarbecuePizza Boxing!");}}


2.芝加哥芝士披萨
public class ChigacoStyleCheesePizza extends Pizza {public ChigacoStyleCheesePizza(PizzaCondimentFactory condimentFactory) {super(condimentFactory);}@Overridepublic void prepare() {this.getCondimentFactory().prepare();}@Overridepublic void boke() {System.out.println("ChigacoStyleCheesePizza Boking!");}@Overridepublic void cut() {System.out.println("ChigacoStyleCheesePizza Cuting!");}@Overridepublic void box() {System.out.println("ChigacoStyleCheesePizza Boxing!");}}

3.纽约烤肉披萨

public class NYStyleBarbecuePizza extends Pizza {public NYStyleBarbecuePizza(PizzaCondimentFactory condimentFactory) {super(condimentFactory);}@Overridepublic void prepare() {this.getCondimentFactory().prepare();}@Overridepublic void boke() {System.out.println("NYStyleBarbecuePizza Boking!");}@Overridepublic void cut() {System.out.println("NYStyleBarbecuePizza Cuting!");}@Overridepublic void box() {System.out.println("NYStyleBarbecuePizza Boxing!");}}

4.纽约芝士披萨

public class NYStyleCheesePizza extends Pizza {public NYStyleCheesePizza(PizzaCondimentFactory condimentFactory) {super(condimentFactory);}@Overridepublic void prepare() {this.getCondimentFactory().prepare();}@Overridepublic void boke() {System.out.println("NYStyleCheesePizza Boking!");}@Overridepublic void cut() {System.out.println("NYStyleCheesePizza Cuting!");}@Overridepublic void box() {System.out.println("NYStyleCheesePizza Boxing!");}}
注意:高层组件中的PizzaCondimentFactory是不同区域不同披萨的原料生产工厂(抽象工厂) 

private PizzaCondimentFactory condimentFactory=null;<span></span>public Pizza(PizzaCondimentFactory condimentFactory) {this.condimentFactory = condimentFactory;}


接下来我们需要一个披萨店来订购披萨:

public class PizzaStore {private PizzaFactory factory;public PizzaStore(PizzaFactory factory) {this.factory = factory;}/*** @Description: //创建披萨* @Title: orderCreate * @param type* @return* Pizza * @throws */public Pizza orderCreate(String type) {Pizza pizza = this.factory.createPizza(type);pizza.prepare();pizza.boke();pizza.cut();pizza.box();return pizza;}public void setFactory(PizzaFactory factory) {this.factory = factory;}}

然后是不同区域的披萨工厂:

public class ChigacoPizzaFactory extends PizzaFactory {private PizzaCondimentFactory condimentFactory=null;public ChigacoPizzaFactory(PizzaCondimentFactory condimentFactory) {this.condimentFactory = condimentFactory;}/** * 芝加哥创建披萨实现 */@Overridepublic Pizza createPizza(String type) {if("barbecue".equals(type)) {return new ChigacoStyleBarbecuePizza(condimentFactory);} else if("cheese".equals(type)) {return new ChigacoStyleCheesePizza(condimentFactory);} else {return null;}}}

public class NYPizzaFactory extends PizzaFactory {private PizzaCondimentFactory condimentFactory=null;public NYPizzaFactory(PizzaCondimentFactory condimentFactory) {this.condimentFactory = condimentFactory;}/** * 纽约工厂创建披萨实现 */@Overridepublic Pizza createPizza(String type) {if("barbecue".equals(type)) {return new NYStyleBarbecuePizza(condimentFactory);} else if("cheese".equals(type)) {return new NYStyleCheesePizza(condimentFactory);} else {return null;}}}
至此 工厂方法相关的对象已经创建完毕,客户端传过来一个type,根据构造方法的工厂类型,运行时调用工厂的createPizza方法


然后来看一下不同披萨的原料配置工厂:

首先抽象原料工厂:

public interface PizzaCondimentFactory {/*** @Description: //奶油 * @Title: cream * void * @throws */public void cream();/*** @Description: //芝士* @Title: Cheese * void * @throws */public void Cheese();/*** @Description: //烤肉* @Title: barbecue * void * @throws */public void barbecue();/*** @Description: //原料准备 * @author yangwl* @date 2015年8月31日  下午12:24:37* @Title: prepare * void * @throws */public void prepare();}

然后是具体工厂:

public class ChigacoStyleBarbecueCondimentFactory implements PizzaCondimentFactory {@Overridepublic void cream() {System.out.println("ChigacoStyleBarbecueCondimentFactory cream().");}@Overridepublic void Cheese() {System.out.println("ChigacoStyleBarbecueCondimentFactory Cheese().");}@Overridepublic void barbecue() {System.out.println("ChigacoStyleBarbecueCondimentFactory barbecue().");}@Overridepublic void prepare() {this.cream();this.Cheese();this.barbecue();}}

public class ChigacoStyleCheeseCondimentFactory implements PizzaCondimentFactory{@Overridepublic void cream() {System.out.println("ChigacoStyleCheeseCondimentFactory cream()");}@Overridepublic void Cheese() {System.out.println("ChigacoStyleCheeseCondimentFactory Cheese()");}@Overridepublic void barbecue() {System.out.println("ChigacoStyleCheeseCondimentFactory barbecue()");}@Overridepublic void prepare() {this.cream();this.Cheese();this.barbecue();}}

public class NYStyleBarbecueCondimentFactory implements PizzaCondimentFactory {@Overridepublic void cream() {System.out.println("NYStyleBarbecueCondimentFactory cream()");}@Overridepublic void Cheese() {System.out.println("NYStyleBarbecueCondimentFactory Cheese()");}@Overridepublic void barbecue() {System.out.println("NYStyleBarbecueCondimentFactory barbecue()");}@Overridepublic void prepare() {this.cream();this.Cheese();this.barbecue();}}

public class NYStyleCheeseCondimentFactory implements PizzaCondimentFactory {@Overridepublic void cream() {System.out.println("NYStyleCheeseCondimentFactory cream()");}@Overridepublic void Cheese() {System.out.println("NYStyleCheeseCondimentFactory Cheese()");}@Overridepublic void barbecue() {System.out.println("NYStyleCheeseCondimentFactory barbecue()");}@Overridepublic void prepare() {this.cream();this.Cheese();this.barbecue();}}

注意在具体工厂中的prepare()方法

好了,所有的对象,工厂都已建立好了

调用:

public class TestMain {public static void main(String[] args) {Pizza pizza = null;PizzaStore store = new PizzaStore(new NYPizzaFactory(new NYStyleBarbecueCondimentFactory()));pizza = store.orderCreate("barbecue");store.setFactory(new ChigacoPizzaFactory(new ChigacoStyleCheeseCondimentFactory()));store.orderCreate("cheese");}}

打印 :

NYStyleBarbecueCondimentFactory cream()NYStyleBarbecueCondimentFactory Cheese()NYStyleBarbecueCondimentFactory barbecue()NYStyleBarbecuePizza Boking!NYStyleBarbecuePizza Cuting!NYStyleBarbecuePizza Boxing!ChigacoStyleCheeseCondimentFactory cream()ChigacoStyleCheeseCondimentFactory Cheese()ChigacoStyleCheeseCondimentFactory barbecue()ChigacoStyleCheesePizza Boking!ChigacoStyleCheesePizza Cuting!ChigacoStyleCheesePizza Boxing!

简单说一下: 这里例子中,结合工厂方法和抽象工厂,其中工厂方法模式中,披萨店持有一个创建披萨工厂的高层组件在构造披萨店时接受一个具体类型的工厂(当然,这在运行时才体现出来,面向接口编程嘛),在运行时,调用createPizza方法动态的返回具体类型的披萨.这样,做到了代码从客户端哪里解耦出来(客户端不用再new了),在看抽象工厂,披萨的高层组件中持有一个原料工厂高层组件(注意:披萨高层组件是一个抽象类,具体类可以继承他的共有属性)。这样,披萨的具体类在被创建时,会接收一个具体的原料工场,具体原料工场会创建一系列对象(当然,为了方法,具体原料工场。中只做了打印 cream() barbecue() cheese() 实际情况应该返回所创建的对象来给具体产品),注意 :这也是在运行时
动态的决定应该创建谁,因为编译阶段谁知道创建谁呢!!高层原料工厂的prepare()声明,在运行时会绑定到具体对象,也就是具体原料工厂,这样,我们在测试的时候,传过去什么类型的原料工厂,就能生产出什么原料的披萨了.


0 0
原创粉丝点击