• 抽象工厂模式


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

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

     
  • 相关阅读:
    react开发环境准备
    react介绍
    课程大纲
    Proving Equivalences HDU-2767 (tarjan缩点)
    tarjan求强连通分量 + 缩点 + 求割点割边
    树的重心(性质+模版)
    Educational Codeforces Round 93 (Rated for Div. 2)(A B C D)
    Friend-Graph HDU
    Codeforces Round #665 (Div. 2) (A B C D E)
    Matrix Again HDU
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/11135508.html
Copyright © 2020-2023  润新知