抽象工厂模式

Posted lishuaiqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象工厂模式相关的知识,希望对你有一定的参考价值。

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.总结

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

 

 

以上是关于抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂模式+工厂方法模式+抽象工厂模式

java抽象工厂的使用意图是啥?

工厂模式抽象工厂模式策略模式

工厂模式 - 抽象工厂

设计模式——抽象工厂模式

设计模式之抽象工厂模式