admin管理员组文章数量:1026989
重新组织披萨店 AbstractFactory
上次讲了工厂方法,现在让我们来试试抽象工厂来组织我们的披萨店。(为什么我写了这么多,因为我不是单纯写设计模式,带着这了编程的思想)
先看概念:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
这句话看上去很简略,通过下面的例子,我们可以很好的理解这句话。
-----------------------------
我们做披萨,针对不同的披萨有不同的食材,比如面饼、酱汁、起司、蔬菜等,所以我们需要一个创建这些食材的接口。定义如下:
public interface PizzaIngredientFactory{public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Veggies[] createVeggies();public Pepperoni createPepperoni();public Clams createClams();
}
这个接口定义了制作所需的食材的方法。
当我们需要制作出不同的披萨的时候,我们首先需要实现这个接口来生成一个专门的为我们这个披萨提供材料的工厂。
于是,我们先生成一个为符合四川人口味的食材提供的工厂:
public class SCPizzaIngredientFactory implements PizzaIngredientFactory{public Dough createDough(){return new 四川人爱的Dough();}public Sauce createSauce(){return new 四川人爱的Sauce();}public Cheese createCheese(){return new 四川人爱的Cheese();}public Veggies[] createVeggies(){Veggies veggies [] ={new 四川人爱的Veggies1(),new 四川人爱的Veggies2()};return veggies;}public Pepperoni createPepperoni(){return new 四川人爱的Pepperoni();}public Clams createClams(){return new 四川人爱的Clams();}
}
这个工厂专门提供四川人爱吃的口味的食材。
以上都只是提供了食材,下面我们来看看披萨!:
public abstract class Pizza{String name;//披萨的名字Dough dough;//披萨所需的各个材料Sauce sauce;Veggies veggies[];Cheese cheese;Pepperoni peperoni;Clams clam;abstract void prepare();void bake(){System.out.println("烘焙这个披萨!");}void cut(){System.out.println("现在来切割它!");}void box(){System.out.println("把披萨装起来!");}void setName(String name){this.name = name;}String getName(){return name;}
}
这里定义的一个抽象类,其中有一个抽象方法prepare(),我们在其他具体的披萨类中再来实现它。这么做的目的是,
因为制作一个披萨,所需的食材是差不多的(这里指的是,都需要dough,sauce,veggies等,所以我们把这些属性定义在这个抽象类里面),只是食材的种类有差别罢了,所以我们抽象类Pizza里面的属性可以通过子类来接收不同的值。
下面我们来制作一个起司披萨:
public class CheesePizza extends Pizza{PizzaIngredientFactory ingredientFactory;//用来接收制作该披萨提供食材的工厂public CheesePizza(PizzaIngredientFactory ingredientFactory){this.ingredientFactory=ingredientFactory;}void prepare(){//实现抽象方法System.out.println("正在制作"+name+"披萨");dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();veggies = ingredientFactory.createVeggies();pepperoni = ingredientFactory.createPepperoni();//.....其他操作} }
这样,四川人爱吃的起司披萨就通过我们的SCPizzaIngredientFactory做出来了。在构造它的时候,我们传入SCPizzaIngredientFactory的对象就可以了。
(注意,这里CheesePizza自己本身并不知道自己所用的具体食材,也就是说,披萨自己不知道自己是不是四川人爱吃的。这个口味是我们通过工厂传进去的值决定的)
来看看这个披萨在披萨店里面是怎么卖的吧!:
public class SCPizzaStore extends PizzaStore{protected Pizza createPizza(String name){Pizza pizza = null;PizzaIngredientFactory ingredientFactory = new SCPizzaIngredientFactory();if(item.equals("cheese")){pizza = new CheesePizza(ingredientFactory);//上面这里的工厂是四川口味的工厂,所以做出来的披萨也是四川人爱吃的披萨pizza.setName("四川人爱吃的起司披萨");}else if(item.equals("pepperoni")){pizza = new PepperoniPizza(ingredientFactory);pizza.setName("四川人爱吃的意大利腊肠披萨");}return pizza;} }
这个四川披萨店,就这样通过四川口味工厂制作出了符合当地口味的披萨。
看完了这个例子,再回头理解一下概念,相信你会有所收获。 不就不求点赞了。。。都没人点暂TT
下面是抽象工厂的类图,红色是我标记出来描述我们这个例子的注释:
重新组织披萨店 AbstractFactory
上次讲了工厂方法,现在让我们来试试抽象工厂来组织我们的披萨店。(为什么我写了这么多,因为我不是单纯写设计模式,带着这了编程的思想)
先看概念:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
这句话看上去很简略,通过下面的例子,我们可以很好的理解这句话。
-----------------------------
我们做披萨,针对不同的披萨有不同的食材,比如面饼、酱汁、起司、蔬菜等,所以我们需要一个创建这些食材的接口。定义如下:
public interface PizzaIngredientFactory{public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Veggies[] createVeggies();public Pepperoni createPepperoni();public Clams createClams();
}
这个接口定义了制作所需的食材的方法。
当我们需要制作出不同的披萨的时候,我们首先需要实现这个接口来生成一个专门的为我们这个披萨提供材料的工厂。
于是,我们先生成一个为符合四川人口味的食材提供的工厂:
public class SCPizzaIngredientFactory implements PizzaIngredientFactory{public Dough createDough(){return new 四川人爱的Dough();}public Sauce createSauce(){return new 四川人爱的Sauce();}public Cheese createCheese(){return new 四川人爱的Cheese();}public Veggies[] createVeggies(){Veggies veggies [] ={new 四川人爱的Veggies1(),new 四川人爱的Veggies2()};return veggies;}public Pepperoni createPepperoni(){return new 四川人爱的Pepperoni();}public Clams createClams(){return new 四川人爱的Clams();}
}
这个工厂专门提供四川人爱吃的口味的食材。
以上都只是提供了食材,下面我们来看看披萨!:
public abstract class Pizza{String name;//披萨的名字Dough dough;//披萨所需的各个材料Sauce sauce;Veggies veggies[];Cheese cheese;Pepperoni peperoni;Clams clam;abstract void prepare();void bake(){System.out.println("烘焙这个披萨!");}void cut(){System.out.println("现在来切割它!");}void box(){System.out.println("把披萨装起来!");}void setName(String name){this.name = name;}String getName(){return name;}
}
这里定义的一个抽象类,其中有一个抽象方法prepare(),我们在其他具体的披萨类中再来实现它。这么做的目的是,
因为制作一个披萨,所需的食材是差不多的(这里指的是,都需要dough,sauce,veggies等,所以我们把这些属性定义在这个抽象类里面),只是食材的种类有差别罢了,所以我们抽象类Pizza里面的属性可以通过子类来接收不同的值。
下面我们来制作一个起司披萨:
public class CheesePizza extends Pizza{PizzaIngredientFactory ingredientFactory;//用来接收制作该披萨提供食材的工厂public CheesePizza(PizzaIngredientFactory ingredientFactory){this.ingredientFactory=ingredientFactory;}void prepare(){//实现抽象方法System.out.println("正在制作"+name+"披萨");dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();veggies = ingredientFactory.createVeggies();pepperoni = ingredientFactory.createPepperoni();//.....其他操作} }
这样,四川人爱吃的起司披萨就通过我们的SCPizzaIngredientFactory做出来了。在构造它的时候,我们传入SCPizzaIngredientFactory的对象就可以了。
(注意,这里CheesePizza自己本身并不知道自己所用的具体食材,也就是说,披萨自己不知道自己是不是四川人爱吃的。这个口味是我们通过工厂传进去的值决定的)
来看看这个披萨在披萨店里面是怎么卖的吧!:
public class SCPizzaStore extends PizzaStore{protected Pizza createPizza(String name){Pizza pizza = null;PizzaIngredientFactory ingredientFactory = new SCPizzaIngredientFactory();if(item.equals("cheese")){pizza = new CheesePizza(ingredientFactory);//上面这里的工厂是四川口味的工厂,所以做出来的披萨也是四川人爱吃的披萨pizza.setName("四川人爱吃的起司披萨");}else if(item.equals("pepperoni")){pizza = new PepperoniPizza(ingredientFactory);pizza.setName("四川人爱吃的意大利腊肠披萨");}return pizza;} }
这个四川披萨店,就这样通过四川口味工厂制作出了符合当地口味的披萨。
看完了这个例子,再回头理解一下概念,相信你会有所收获。 不就不求点赞了。。。都没人点暂TT
下面是抽象工厂的类图,红色是我标记出来描述我们这个例子的注释:
本文标签: 重新组织披萨店AbstractFactory
版权声明:本文标题:重新组织披萨店AbstractFactory 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/IT/1694670795a254869.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论