Java设计模式:抽象工厂模式(Abstract Factroy Pattern)
来源:互联网 发布:网络管理常用协议 编辑:程序博客网 时间:2024/06/05 16:43
抽象工厂模式定义
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
样例
上次的工厂方法模式使用的是披萨店的例子,为的是解决在各个不同的地区开的分店会做不同类型的披萨;
现在防止分店使用低价原料增加利润,损坏品牌,要确保每家店使用高质量的原料,所以打算使用生产原料的工厂;
但问题是每家分站使用的配料有可能不一样,如纽约的蛤蜊是新鲜的, 芝加哥的蛤蜊是冰冻的。
UML类图
注意由于太多,类图中的原料少画了2种:Pepperoni 与 Veggie,不影响大局。
代码
Dough.java
package com.jing.factory.abs;public interface Dough {public String toString();}DoughChicago.java
package com.jing.factory.abs;public class DoughChicago implements Dough {public String toString(){return "Chicago Style Dough";}}DoughNY.java
package com.jing.factory.abs;public class DoughNY implements Dough {public String toString(){return "NY Style Dough";}}Sauce.java
package com.jing.factory.abs;public interface Sauce {public String toString();}SauceChicago.java
package com.jing.factory.abs;public class SauceChicago implements Sauce {public String toString(){return "Chicago Style Sauce";}}SauceNY.java
package com.jing.factory.abs;public class SauceNY implements Sauce {public String toString(){return "NY Style Sauce";}}Cheese.java
package com.jing.factory.abs;public interface Cheese {public String toString();}CheeseChicago.java
package com.jing.factory.abs;public class CheeseChicago implements Cheese {public String toString(){return "Chicago Style Cheese";}}CheeseNY.java
package com.jing.factory.abs;public class CheeseNY implements Cheese {public String toString(){return "NY Style Cheese";}}Clams.java
package com.jing.factory.abs;public interface Clams {public String toString();}ClamsChicago.java
package com.jing.factory.abs;public class ClamsChicago implements Clams {public String toString(){return "Chicago Style Clams";}}ClamsNY.java
package com.jing.factory.abs;public class ClamsNY implements Clams {public String toString(){return "NY Style Clams";}}Pepperoni.java
package com.jing.factory.abs;public interface Pepperoni {public String toString();}PepperoniChicago.java
package com.jing.factory.abs;public class PepperoniChicago implements Pepperoni {public String toString(){return "Chicago Style Pepperoni";}}PepperoniNY.java
package com.jing.factory.abs;public class PepperoniNY implements Pepperoni {public String toString(){return "NY Style Pepperoni";}}Veggies.java
package com.jing.factory.abs;public interface Veggies {public String toString();}VeggiesGarlic.java
package com.jing.factory.abs;public class VeggiesGarlic implements Veggies {public String toString(){return "Veggies Garlic";}}VeggiesMushroom.java
package com.jing.factory.abs;public class VeggiesMushroom implements Veggies {public String toString(){return "Veggies Mushroom";}}VeggiesOlives.java
package com.jing.factory.abs;public class VeggiesOlives implements Veggies {public String toString(){return "Veggies Olives";}}VeggiesOnion.java
package com.jing.factory.abs;public class VeggiesOnion implements Veggies {public String toString(){return "Veggies Onion";}}VeggiesRedPepper.java
package com.jing.factory.abs;public class VeggiesRedPepper implements Veggies {public String toString(){return "Veggies Red Pepper";}}PizzaIngredientFactory.java
package com.jing.factory.abs;public interface PizzaIngredientFactory {public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Veggies[] createVeggies();public Pepperoni createPepperoni();public Clams createClam();}PizzaIngredientFactoryChicago.java
package com.jing.factory.abs;public class PizzaIngredientFactoryChicago implements PizzaIngredientFactory {public Dough createDough() {// TODO Auto-generated method stubreturn new DoughChicago();}public Sauce createSauce() {// TODO Auto-generated method stubreturn new SauceChicago();}public Cheese createCheese() {// TODO Auto-generated method stubreturn new CheeseChicago();}public Veggies[] createVeggies() {// TODO Auto-generated method stubVeggies veggies[] = {new VeggiesOlives(),new VeggiesMushroom(),new VeggiesOnion()};return veggies;}public Pepperoni createPepperoni() {// TODO Auto-generated method stubreturn new PepperoniChicago();}public Clams createClam() {// TODO Auto-generated method stubreturn new ClamsChicago();}}PizzaIngredientFactoryNY.java
package com.jing.factory.abs;public class PizzaIngredientFactoryNY implements PizzaIngredientFactory {public Dough createDough() {// TODO Auto-generated method stubreturn new DoughNY();}public Sauce createSauce() {// TODO Auto-generated method stubreturn new SauceNY();}public Cheese createCheese() {// TODO Auto-generated method stubreturn new CheeseNY();}public Veggies[] createVeggies() {// TODO Auto-generated method stubVeggies veggies[] = {new VeggiesGarlic(),new VeggiesRedPepper(),new VeggiesMushroom()};return veggies;}public Pepperoni createPepperoni() {// TODO Auto-generated method stubreturn new PepperoniNY();}public Clams createClam() {// TODO Auto-generated method stubreturn null;}}
现在开始我们的披萨类
Pizza.java
package com.jing.factory.abs;public abstract class Pizza {protected String name;Dough dough;Sauce sauce;Veggies veggies[];Cheese cheese;Pepperoni pepperoni;Clams clam;abstract void prepare();void bake(){System.out.println("Bake for 25 minutes at 350");}void cut(){System.out.println("Cutting the pizza into diagonal slices");}void box(){System.out.println("Place pizza in offical PizzaStore box");}void setName(String name){this.name = name;}String getName(){return name;}public String toString(){StringBuffer result = new StringBuffer();result.append("----- " +name +" --------- " + "\n");if (dough != null){result.append(dough);result.append("\n");}if (sauce != null){result.append(sauce);result.append("\n");}if (cheese != null) {result.append(cheese);result.append("\n");}if (veggies != null){for (int i = 0; i < veggies.length; i++){result.append(veggies[i]);if (i < veggies.length - 1){result.append(", ");}}result.append("\n");}if (clam != null){result.append(clam);result.append("\n");}if (pepperoni != null){result.append(pepperoni);result.append("\n");}return result.toString();}}Pizza_Cheese.java
package com.jing.factory.abs;public class Pizza_Cheese extends Pizza {PizzaIngredientFactory ingredientFactory;public Pizza_Cheese(PizzaIngredientFactory ingredientFactory){this.ingredientFactory = ingredientFactory;}@Overridevoid prepare() {// TODO Auto-generated method stubSystem.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();}}Pizza_Clam.java
package com.jing.factory.abs;public class Pizza_Clam extends Pizza {PizzaIngredientFactory ingredientFactory;public Pizza_Clam(PizzaIngredientFactory ingredientFactory){this.ingredientFactory = ingredientFactory;}@Overridevoid prepare() {// TODO Auto-generated method stubSystem.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();clam = ingredientFactory.createClam();}}Pizza_Pepperoni.java
package com.jing.factory.abs;public class Pizza_Pepperoni extends Pizza {PizzaIngredientFactory ingredientFactory;public Pizza_Pepperoni(PizzaIngredientFactory ingredientFactory){this.ingredientFactory = ingredientFactory;}@Overridevoid prepare() {// TODO Auto-generated method stubSystem.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();veggies = ingredientFactory.createVeggies();pepperoni = ingredientFactory.createPepperoni();}}Pizza_Veggie.java
package com.jing.factory.abs;public class Pizza_Veggie extends Pizza {PizzaIngredientFactory ingredientFactory;public Pizza_Veggie(PizzaIngredientFactory ingredientFactory){this.ingredientFactory = ingredientFactory;}public void prepare(){System.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();veggies = ingredientFactory.createVeggies();}}有了披萨后,我们应该开始写披萨店了
PizzaStore.java
package com.jing.factory.abs;public abstract class PizzaStore {protected abstract Pizza createPizza(String type);public Pizza orderPizza(String type) {Pizza pizza = createPizza(type);System.out.println("-------- Making a " + pizza.getName() + " -----");pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}}PizzaStoreChicago.java
package com.jing.factory.abs;public class PizzaStoreChicago extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {// TODO Auto-generated method stubPizza pizza = null;PizzaIngredientFactory ingredientFactory = new PizzaIngredientFactoryChicago();if (type.equals("cheese")){pizza = new Pizza_Cheese(ingredientFactory);pizza.setName("Chicago Style Cheese Pizza");} else if (type.equals("veggie")){pizza = new Pizza_Veggie(ingredientFactory);pizza.setName("Chicago Style Veggie Pizza");} else if (type.equals("clam")){pizza = new Pizza_Clam(ingredientFactory);pizza.setName("Chicago Style Clam Pizza");} else if (type.equals("pepperoni")){pizza = new Pizza_Pepperoni(ingredientFactory);pizza.setName("Chicago Style Pepperoni Pizza");}return pizza;}}PizzaStoreNY.java
package com.jing.factory.abs;public class PizzaStoreNY extends PizzaStore {@Overrideprotected Pizza createPizza(String type) {// TODO Auto-generated method stubPizza pizza = null;PizzaIngredientFactory ingredientFactory = new PizzaIngredientFactoryNY();if (type.equals("cheese")){pizza = new Pizza_Cheese(ingredientFactory);pizza.setName("NY Style Cheese Pizza");} else if (type.equals("veggie")){pizza = new Pizza_Veggie(ingredientFactory);pizza.setName("NY Style Veggie Pizza");} else if (type.equals("clam")){pizza = new Pizza_Clam(ingredientFactory);pizza.setName("NY Style Clam Pizza");} else if (type.equals("pepperoni")){pizza = new Pizza_Pepperoni(ingredientFactory);pizza.setName("NY Style Pepperoni Pizza");}return pizza;}}现在开始写测试类
Test.java
package com.jing.factory.abs;public class Test {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub// 开一个纽约的披萨店PizzaStore nyStore = new PizzaStoreNY();// 开 一个芝加哥的披萨店PizzaStore chicagoStore = new PizzaStoreChicago();Pizza pizza = null;// 开始订披萨// 奶酪披萨pizza = nyStore.orderPizza("cheese");System.out.println("Customer A ordered a " + pizza + "\n");pizza = chicagoStore.orderPizza("cheese");System.out.println("Customer B ordered a " + pizza + "\n");// 蛤蜊披萨pizza = nyStore.orderPizza("clam");System.out.println("Customer A ordered a " + pizza + "\n");pizza = chicagoStore.orderPizza("clam");System.out.println("Customer B ordered a " + pizza + "\n");// 意式辣肠披萨pizza = nyStore.orderPizza("pepperoni");System.out.println("Customer A ordered a " + pizza + "\n");pizza = chicagoStore.orderPizza("pepperoni");System.out.println("Customer B ordered a " + pizza + "\n");// 蔬菜披萨pizza = nyStore.orderPizza("veggie");System.out.println("Customer A ordered a " + pizza + "\n");pizza = chicagoStore.orderPizza("veggie");System.out.println("Customer B ordered a " + pizza + "\n");}}输出
-------- Making a NY Style Cheese Pizza -----Preparing NY Style Cheese PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer A ordered a ----- NY Style Cheese Pizza --------- NY Style DoughNY Style SauceNY Style Cheese-------- Making a Chicago Style Cheese Pizza -----Preparing Chicago Style Cheese PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer B ordered a ----- Chicago Style Cheese Pizza --------- Chicago Style DoughChicago Style SauceChicago Style Cheese-------- Making a NY Style Clam Pizza -----Preparing NY Style Clam PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer A ordered a ----- NY Style Clam Pizza --------- NY Style DoughNY Style SauceNY Style Cheese-------- Making a Chicago Style Clam Pizza -----Preparing Chicago Style Clam PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer B ordered a ----- Chicago Style Clam Pizza --------- Chicago Style DoughChicago Style SauceChicago Style CheeseChicago Style Clams-------- Making a NY Style Pepperoni Pizza -----Preparing NY Style Pepperoni PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer A ordered a ----- NY Style Pepperoni Pizza --------- NY Style DoughNY Style SauceNY Style CheeseVeggies Garlic, Veggies Red Pepper, Veggies MushroomNY Style Pepperoni-------- Making a Chicago Style Pepperoni Pizza -----Preparing Chicago Style Pepperoni PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer B ordered a ----- Chicago Style Pepperoni Pizza --------- Chicago Style DoughChicago Style SauceChicago Style CheeseVeggies Olives, Veggies Mushroom, Veggies OnionChicago Style Pepperoni-------- Making a NY Style Veggie Pizza -----Preparing NY Style Veggie PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer A ordered a ----- NY Style Veggie Pizza --------- NY Style DoughNY Style SauceNY Style CheeseVeggies Garlic, Veggies Red Pepper, Veggies Mushroom-------- Making a Chicago Style Veggie Pizza -----Preparing Chicago Style Veggie PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in offical PizzaStore boxCustomer B ordered a ----- Chicago Style Veggie Pizza --------- Chicago Style DoughChicago Style SauceChicago Style CheeseVeggies Olives, Veggies Mushroom, Veggies Onion
阅读全文
1 0
- Java设计模式:抽象工厂模式(Abstract Factroy Pattern)
- 设计模式之抽象工厂模式(Abstract Factroy)
- 工厂模式(Factroy Pattern)
- java设计模式---Abstract Facotry Pattern---抽象工厂模式
- JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】
- Java设计模式--抽象工厂模式【Abstract Factory Pattern】
- JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】
- 设计模式3:Abstract Factory Pattern(抽象工厂模式)
- 浅谈设计模式:抽象工厂模式(Abstract Factory Pattern)
- 设计模式:抽象工厂模式(Abstract Factory Pattern)
- 设计模式(3):抽象工厂模式(Abstract Factory Pattern)
- 【设计模式】抽象工厂模式(Abstract Factory Pattern)
- 设计模式【抽象工厂Abstract Factory Pattern】
- Java Abstract Factory Pattern(抽象工厂模式)
- 抽象工厂设计模式(Abstract Factory Design Pattern)
- 设计模式之-抽象工厂(Abstract Factory Pattern)
- 设计模式——抽象工厂(Abstract Factory Pattern)
- Java设计模式——抽象工厂模式(Abstract Factory Pattern)
- Java学习中关于用cmd执行.class文件
- 机器学习实战_09树回归
- 修改npm镜像源
- HDU 4725 The Shortest Path in Nya Graph(最短路)
- 构建ssm的时候遇到的错误一
- Java设计模式:抽象工厂模式(Abstract Factroy Pattern)
- 质数 数论
- 仿支付宝密码输入键盘
- fpga控制vga显示彩色图片
- 典型的 C++ 程序员成长经历
- 关于BRDF
- Java并发/多线程教程
- 线程学习笔记(十)-解决死锁
- 【布隆过滤器】实现一个简单的布隆过滤器