每天学一点设计模式-抽象工厂模式

来源:互联网 发布:dbc2000麻痹戒指数据 编辑:程序博客网 时间:2024/04/19 15:11

抽象工厂模式


英文名


Abstract Factory Pattern


定义


提供一个接口,用于创建相关或对象家族,而无需指定具体类


原则


要依赖抽象,不要依赖具体类


理解


1.相互直接交流的是工厂抽象类,你无需知道他具体的实现类是哪一个。这样就做到了面向抽象工厂类来编程。

2.抽象工厂类中定义了产生所有产品的方法。只是每个产品因地域差异而不同,但是都属于某一个类别的产品。这里面产品也要抽象成接口。

3.这个时候我们想要的不同的产品是由工厂子类决定。而这个子类是在动态运行过程中才会知道。编码阶段完全可以不用考虑。我们只要知道,我要的产品,工厂会给我生产出来就完事啦。


代码


抽象工厂接口


public interface PizzaIngredientFactory {public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Veggies[] createVeggies();public Pepperoni createPepperoni();public Clams createClam();}

实现类


public class NYPizzaIngredientFactory implements PizzaIngredientFactory {    @Override    public Dough createDough() {        // TODO Auto-generated method stub        return new ThinCrustDough();    }    @Override    public Sauce createSauce() {        // TODO Auto-generated method stub        return new MarinaraSauce();    }    @Override    public Cheese createCheese() {        // TODO Auto-generated method stub        return new ReggianoCheese();    }    @Override    public Veggies[] createVeggies() {        // TODO Auto-generated method stub        Veggies veggies[] = {new Garlic(),new Onion(),new Mushroom(),new RedPepper()};        return veggies;    }    @Override    public Pepperoni createPepperoni() {        // TODO Auto-generated method stub        return new SlicedPepperoni();    }    @Override    public Clams createClam() {        // TODO Auto-generated method stub        return new FreshClams();    }}

其中用到的实体类接口以及具体实现


/** * Description:原料,奶酪 */public interface Cheese {}

public class ReggianoCheese implements Cheese {}

/**原料,蛤蜊 */public interface Clams {}

public class FreshClams implements Clams {}

/** * Description:原料,面皮 */public interface Dough {}

public class ThinCrustDough implements Dough {}

/** * Description:原料,蔬菜 */public interface Veggies {}

public class Garlic implements Veggies {}
public class Mushroom implements Veggies {}

public class Onion implements Veggies {}

public class RedPepper implements Veggies {}


/** * Description:原料,酱汁 */public interface Sauce {}

public class MarinaraSauce implements Sauce {}

/** * Description:原料,辣香肠 */public interface Pepperoni {}

public class SlicedPepperoni implements Pepperoni {}

改造上一篇文章的pizza类,


public abstract class Pizza {String name;Dough dough;Sauce sauce;Veggies veggies[];Cheese cheese;Pepperoni pipperoni;Clams clam;public abstract void prepare();public void bake() {System.out.println("Bake for 25 minutes at 350");}public void cut() {System.out.println("Cutting the pizza into diagonal slices");}public void box() {System.out.println("Place pizza in official PizzaStore box");}public String getName() {return name;}public void setName(String name) {this.name = name;}}

现在不需要有NYStylePizza,直接正对pizza原料产生不同的pizza就行

奶酪pizza

public class CheesePizza extends Pizza {PizzaIngredientFactory ingredientFactory;public CheesePizza(PizzaIngredientFactory ingredientFactory) {this.ingredientFactory = ingredientFactory;}@Overridepublic void prepare() {System.out.println("Preparing " + name);dough = ingredientFactory.createDough();sauce = ingredientFactory.createSauce();cheese = ingredientFactory.createCheese();}}

蛤蜊pizza


public class ClamPizza extends Pizza {PizzaIngredientFactory ingregientFactory;public ClamPizza(PizzaIngredientFactory ingregientFactory){this.ingregientFactory = ingregientFactory;}@Overridepublic void prepare() {System.out.println("Preparing " + name);dough = ingregientFactory.createDough();sauce = ingregientFactory.createSauce();cheese = ingregientFactory.createCheese();clam = ingregientFactory.createClam();}}

pizza店


public class NYStylePizzaStore extends PizzaStore {@Overrideprotected Pizza createPizza(String item) {Pizza pizza = null;PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();if (item.equals("cheese")) {pizza = new CheesePizza(ingredientFactory);pizza.setName("New York Style Cheese Pizza");} else if (item.equals("clam")) {pizza = new ClamPizza(ingredientFactory);}return pizza;}}

测试程序


public class PizzaTestDrive {public static void main(String[] args) {PizzaStore nyStore = new NYStylePizzaStore();Pizza pizza = nyStore.orderPizza("cheese");System.out.println("Ethan ordered a " + pizza.getName() + "\n");}}

输出


Preparing New York Style Cheese PizzaBake for 25 minutes at 350Cutting the pizza into diagonal slicesPlace pizza in official PizzaStore boxEthan ordered a New York Style Cheese Pizza



0 0
原创粉丝点击