抽象工厂模式

2018-01-22  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读