zoukankan      html  css  js  c++  java
  • 抽象工厂模式

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

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

     
  • 相关阅读:
    scrapy怎么设置带有密码的代理ip base64.encodestring不能用 python3.5,base64库里面的encodestring()被换成了什么?
    ace模板dataTables_length控制是否显示分页
    Django AUTHENTICATION_BACKENDS
    Django自定义User模型和登录验证
    一个简单的django user.is_authenticated问题
    PHP函数(四)-变量函数
    PHP函数(三)-递归函数
    Python多进程
    Python多线程-生产者消费者模型
    Python多线程-队列
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/11135508.html
Copyright © 2011-2022 走看看