抽象工厂方法

来源:互联网 发布:淘宝怎么设置客服接待 编辑:程序博客网 时间:2024/05/29 03:45

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

这里写图片描述

1. 披萨基类

public abstract class Pizza {    protected String name;    protected Dough dough;    protected Sauce sauce;    protected Veggies veggies[];    protected Cheese cheese;    protected Clams clams;    public abstract void prepare();    public void bake(){        System.out.println("Bake for 25 minuts at 350");    }    public void cut(){        System.out.println("Cutting the pizza into diagonal slices");    }    public void box(){        System.out.println("Place pizza in official PizzaStore box");    }    public abstract void setName(String name);    @Override    public String toString() {        StringBuilder content = new StringBuilder();        content.append("Pizza [").append(" name = ").append(name);        if(dough != null){            content.append(", dough = ").append(dough.getName());        }        if(sauce != null){            content.append(", sauce = ").append(sauce.getName());        }        if(cheese != null){            content.append(", cheese = ").append(cheese.getName());        }        if(clams != null){            content.append(", clams = ").append(clams.getName());        }        if(veggies != null){            content.append(", veggies = [ ");            for (Veggies veggie : veggies) {                content.append(veggie.getName());            }            content.append(" ]");        }        content.append(" ]");        return content.toString();    }}

2. 披萨派生类

public class CheesePizza extends Pizza {    private PizzaIngredientFactory factory;    public CheesePizza(PizzaIngredientFactory factory) {        super();        this.factory = factory;    }    @Override    public void prepare() {        System.out.println("Preparing " + name);        super.dough = factory.createDough();        super.sauce = factory.createSauce();        super.cheese = factory.createCheese();    }    @Override    public void setName(String name) {        super.name = name;    }}public class ClamPizza extends Pizza {    private PizzaIngredientFactory factory;    public ClamPizza(PizzaIngredientFactory factory) {        super();        this.factory = factory;    }    @Override    public void prepare() {        System.out.println("Preparing " + name);        super.dough = factory.createDough();        super.sauce = factory.createSauce();        super.cheese = factory.createCheese();        super.clams = factory.createClam();    }    @Override    public void setName(String name) {        super.name = name;    }}

3. 披萨工厂基类

public abstract class AbstractPizzaFactory {    public Pizza orderPizza(String type){        Pizza pizza = createPizza(type);        pizza.prepare();        return pizza;    }    public abstract Pizza createPizza(String type);}

4. 披萨工厂派生类

public class NYPizzaFactory extends AbstractPizzaFactory{    private PizzaIngredientFactory factory;    public NYPizzaFactory(PizzaIngredientFactory factory) {        super();        this.factory = factory;    }    @Override    public Pizza createPizza(String type) {        Pizza pizza = null;        if("cheese".equals(type)){             pizza = new CheesePizza(factory);             pizza.setName("New York Style Cheese Pizza");        }else if("clam".equals(type)){            pizza =  new ClamPizza(factory);            pizza.setName("New York Style Clam pizza");        }        return pizza;    }}public class ChicagoPizzaFactory extends AbstractPizzaFactory{    private PizzaIngredientFactory factory;    public ChicagoPizzaFactory(PizzaIngredientFactory factory) {        super();        this.factory = factory;    }    @Override    public Pizza createPizza(String type) {        Pizza pizza = null;        if("cheese".equals(type)){             pizza = new CheesePizza(factory);             pizza.setName("Chicago Style Cheese Pizza");        }else if("clam".equals(type)){            pizza =  new ClamPizza(factory);            pizza.setName("Chicago Style Clam pizza");        }        return pizza;    }}

5. 原料工厂接口

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

6. 原料抽象工厂

public class NYPizzaIngredientFactory implements PizzaIngredientFactory{    public Dough createDough() {        return new ThinCrustDough();    }    public Sauce createSauce() {        return new MarinaraSauce();    }    public Cheese createCheese() {        return new ReggianoCheese();    }    public Veggies[] createVeggies() {        return new Veggies[]{new Garlic(),new Mushroom(),new Onion(), new RedPepper()};    }    public Pepperoni createPepperoni() {        return new SlicedPepperoni();    }    public Clams createClam() {        return new FreshClams();    }}public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{    public Dough createDough() {        return new ThinCrustDough();    }    public Sauce createSauce() {        return new MarinaraSauce();    }    public Cheese createCheese() {        return new ReggianoCheese();    }    public Veggies[] createVeggies() {        return new Veggies[]{new RedPepper()};    }    public Pepperoni createPepperoni() {        return new SlicedPepperoni();    }    public Clams createClam() {        return new FreshClams();    }}

7.原料

public abstract class Cheese {    public abstract String getName();   }public class ReggianoCheese extends Cheese{    @Override    public String getName() {        return "ReggianoCheese";    }}public abstract class Clams {    public abstract String getName();}public class FreshClams extends Clams{    @Override    public String getName() {        return "FreshClams";    }}public abstract class Dough {    public abstract String getName();}public class ThinCrustDough extends Dough{    @Override    public String getName() {        return "ThinCrustDough";    }}public abstract class Pepperoni {    public abstract String getName();}public class SlicedPepperoni extends Pepperoni{    @Override    public String getName() {        return "SlicedPepperoni";    }}public abstract class Sauce {    public abstract String getName();}public class MarinaraSauce extends Sauce{    @Override    public String getName() {        return "MarinaraSauce";    }}public abstract class Veggies {    public abstract String getName();}public class Garlic extends Veggies{    @Override    public String getName() {        return "Garlic";    }}public class Mushroom extends Veggies{    @Override    public String getName() {        return "Mushroom";    }}public class Onion extends Veggies{    @Override    public String getName() {        return "Onion";    }}public class RedPepper extends Veggies{    @Override    public String getName() {        return "RedPepper";    }}

8. 测试

public class AbstractFactoryTest {    public static void main(String[] args) {        //选择原料抽象工厂        PizzaIngredientFactory nyIngredFactory = new NYPizzaIngredientFactory();        PizzaIngredientFactory chicagoIngredFactory = new ChicagoPizzaIngredientFactory();        //选择披萨工厂        NYPizzaFactory nyPizzaFactory = new NYPizzaFactory(nyIngredFactory);        ChicagoPizzaFactory chicagoPizzaFactory = new ChicagoPizzaFactory(chicagoIngredFactory);        Pizza nyCheesePizza = nyPizzaFactory.orderPizza("cheese");        Pizza chicagoClamPizza = chicagoPizzaFactory.orderPizza("clam");        System.out.println(nyCheesePizza.toString());        System.out.println(chicagoClamPizza.toString());    }}

9. 运行结果

Preparing New York Style Cheese PizzaPreparing Chicago Style Clam pizzaPizza [ name = New York Style Cheese Pizza, dough = ThinCrustDough, sauce = MarinaraSauce, cheese = ReggianoCheese ]Pizza [ name = Chicago Style Clam pizza, dough = ThinCrustDough, sauce = MarinaraSauce, cheese = ReggianoCheese, clams = FreshClams ]
原创粉丝点击