抽象工厂模式

1.定义

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类.

抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道具体产品是什么.

2.代码实现

还是以披萨为例子,这边可以利用抽象工厂生产不同地区的调料,按照抽象工厂的定义,我们需要先定义一个生产面团,沙司,奶酪,蔬菜等材料的接口

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() {
        return new ThinCrustDough();
    }

    @Override
    public Sauce createSauce() {
        return new MarinaraSauce();
    }

    @Override
    public Cheese createCheese() {
        return new ReggianoCheese();
    }

    @Override
    public Veggies[] createVeggies() {
        Veggies veggies[] = {new Garlic(), new Onion(), new Mushroom(), new RedPepper()};
        return veggies;
    }

    @Override
    public Pepperoni createPepperoni() {
        return new SlicedPepperoni();
    }

    @Override
    public Clams createClam() {
        return new FreshClam();
    }

}

 

直接在CheesePizza中实现相关的材料即可

public class CheesePizza extends Pizza {
    PizzaIngredientFactory ingredientFactory;
    
    public CheesePizza(PizzaIngredientFactory ingredientFactory) {
        this.ingredientFactory = ingredientFactory;
    }

    @Override
    void prepare() {
        System.out.println("prepare:"+name);
        dough = ingredientFactory.createDough();
        sauce = ingredientFactory.createSauce();
        cheese = ingredientFactory.createCheese();
        
    }

}

这边我们可以看到,可以根据传入具体的材料工厂来实现不同的披萨,所以我们可以实现各种pizzy,只需要定义一个CheesePizza类即可,不用像工厂模式一样定义NYCheesePizza,ChicagoCheesePizza,这边整体就看起来简单多了.

 

直接根据材料工厂来生成pizza即可.

public class NYStylePizzaStore extends PizzaStore {
    
    public NYStylePizzaStore() {
        super();
    }


    @Override
    Pizza createPizza(String type) {
        Pizza pizza = null;
        PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
        if (type.equals("cheese")) {
            pizza = new CheesePizza(ingredientFactory);
        } if (type.equals("clam")) {
            pizza = new ClamPizza(ingredientFactory);
        }
        return pizza;
    }

}

 

3.总结

和工厂模式不同的是,工厂模式是在类中定义一个抽象方法生成对象,然后子类通过继承父类实现这个抽象方法,但是抽象工厂模式是定义一组接口,生成相关对象的产品家族,用这个产品家族在生成所需要的对象,感觉抽象工厂模式和简单工厂模式有点相似,但是不同的是简单工厂只是具体的类,而抽象工厂模式是接口.

 

 

posted @ 2019-07-04 23:08  随意的马蒂洛克  阅读(153)  评论(0编辑  收藏  举报