美文网首页
抽象工厂模式

抽象工厂模式

作者: 阳光的技术小栈 | 来源:发表于2018-01-22 15:13 被阅读11次

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

    示例—披萨店

    一家披萨店,有很多种口味的披萨可接收下单。为了扩展加盟店,每个披萨从制作到最后出炉,都有一套统一标准化的流程。流程包括准备所有的披萨的配料、准备制作(加酱料、揉面团等)、烘烤、切角、装盒。披萨本身有自己的名称、需要的生面团、酱料以及其他配料。现有纽约和芝加哥两个加盟店,虽然他们店中的披萨种类都一样,但实际出来的口味是不同的,比如纽约芝士披萨(大蒜蕃茄酱以及薄饼)和芝加哥芝士披萨(小蕃茄酱以及厚饼)。所有加盟店的流程以及披萨的种类都是一致的。所有的配料都要由工厂统一生产加工,每个地方可以开一家配料工厂。

    UML图表示

    抽象工厂-披萨店

    代码演示

    配料工厂接口

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

    纽约配料工厂实现类

    package AbstractFactory;
    
    class ThinCrustDough implements Dough {}
    class MarinaraSauce implements Sauce {}
    class ReggianoCheese implements Cheese {}
    class Garlic implements Veggies {}
    class Onion implements Veggies {}
    class Mushroom implements Veggies {}
    class RedPepper implements Veggies {}
    class SlicedPepperoni implements Pepperoni {}
    class FreshClams implements Clams {}
    
    
    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 FreshClams();
        }
    }
    

    芝加哥配料工厂实现类

    package AbstractFactory;
    
    class ThickCrustDough implements Dough {}
    class PlumTomatoSauce implements Sauce {}
    class Mozzarella implements Cheese {}
    class Spinach implements Veggies {}
    class Eggplant implements Veggies {}
    class BlackOlives implements Veggies {}
    class FrozenClams implements Clams {}
    
    public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
        @Override
        public Dough createDough() {
            return new ThickCrustDough();
        }
    
        @Override
        public Sauce createSauce() {
            return new PlumTomatoSauce();
        }
    
        @Override
        public Cheese createCheese() {
            return new Mozzarella();
        }
    
        @Override
        public Veggies[] createVeggies() {
            Veggies veggies[] = {new Spinach(), new Eggplant(), new BlackOlives()};
            return veggies;
        }
    
        @Override
        public Pepperoni createPepperoni() {
            return new SlicedPepperoni();
        }
    
        @Override
        public Clams createClam() {
            return new FrozenClams();
        }
    }
    

    披萨抽象基类

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

    芝士披萨子类

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

    蚌蛤披萨子类

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

    披萨店抽象基类

    package AbstractFactory;
    
    public abstract class PizzaStore {
        public Pizza orderPizza(String type) {
            Pizza pizza;
            pizza = createPizza(type);
    
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
    
            return pizza;
    
        }
    
        protected abstract Pizza createPizza(String type);
    }
    

    纽约披萨店子类

    package AbstractFactory;
    
    public class NYPizzaStore extends PizzaStore {
    
        @Override
        protected Pizza createPizza(String type) {
            Pizza pizza = null;
            PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
    
            if (type.equals("cheese")) {
                pizza = new CheesePizza(ingredientFactory);
                pizza.setName("New York Style Cheese Pizza");
            }
            else if (type.equals("veggie")){
    
            }
            else if (type.equals("clam")){
    
            }
            else if (type.equals("pepperoni")){
    
            }
            return pizza;
        }
    }
    

    芝加哥披萨店子类

    package AbstractFactory;
    
    public class ChicagoPizzaStore extends PizzaStore {
    
        @Override
        protected Pizza createPizza(String type) {
            Pizza pizza = null;
            PizzaIngredientFactory ingredientFactory = new ChicagoPizzaIngredientFactory();
    
            if (type.equals("cheese")) {
                pizza = new CheesePizza(ingredientFactory);
                pizza.setName("Chicago Style Cheese Pizza");
            }
            else if (type.equals("veggie")){
    
            }
            else if (type.equals("clam")){
    
            }
            else if (type.equals("pepperoni")){
    
            }
            return pizza;
        }
    }
    

    披萨下单测试代码

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

    测试结果

    Preparing New York Style Cheese Pizza
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Ethan ordered a New York Style Cheese Pizza
    
    Preparing Chicago Style Cheese Pizza
    Bake for 25 minutes at 350
    Cutting the pizza into diagonal slices
    Place pizza in official PizzaStore box
    Joel ordered a Chicago Style Cheese Pizza
    

    相关文章

      网友评论

          本文标题:抽象工厂模式

          本文链接:https://www.haomeiwen.com/subject/jsigixtx.html