工厂模式

来源:互联网 发布:自动拨号软件 编辑:程序博客网 时间:2024/06/04 18:52

  一、概述

  定义:工厂模式定义了一个创建产品对象的接口,由子类决定要实例化的是哪一个具体的产品类。工厂模式是代替new操作的一种模式。

  类图:

工厂模式封装具体类型的实例化,抽象的Creator具有工厂方法,它的任何子类都要实现该方法,由这些子类负责创建实例。

二、具体例子

场景描述:一个做pizza的商家具有多家pizza连锁店,每个店都能生产pizza,为了讨好不同地区顾客的口味,同一名字的pizza做法也有差别。商店需要用同一套售卖系统。

根据描述,开始设计需要用到的类,需要一个PizzaStore(代表类图中的Creator), APizzaStore(代表ConcreteCreator,A地区的店),BpizzaStore(B地区的店),Pizza(代表Product)以及一些不同具体pizza类(代表ConcreteProduct)。

类图:

代码:

public class Pizza {    protected String name;    protected String dough;   //面粉类型    protected String sauce;   //调味酱汁    public void prepare() {        //做pizza的一些事前准备    }    public void bake() {        System.out.println("Bake for 25 minutes");    }    public void cut() {        System.out.println("Cutting the pizza");    }    public void box() {        System.out.println("Place pizza in box");    }    public String getName() {        return name;    }}
public class ACheesePizza extends Pizza {    public ACheesePizza() {        name = "A area style Cheese Pizza"; //A地区风味的Cheese Pizza        dough = "xxx";        sauce = "yyy";    }}public class AClamPizza extends Pizza{    public AClamPizza() {        name = "A area style Clam Pizza"; //A地区风味的Clam Pizza        dough = "xxx";        sauce = "yyy";    }}public class BCheesePizza extends Pizza {    public BCheesePizza() {        name = "B area style Cheese Pizza"; //B地区风味的Cheese Pizza        dough = "xxx";        sauce = "yyy";    }    @Override    public void bake() {        System.out.println("Bake for 20 minutes"); //烤20分钟    }}public class BClamPizza extends Pizza {    public BClamPizza() {        name = "B area style Clam Pizza"; //B地区风味的Clam Pizza        dough = "xxx";        sauce = "yyy";    }}
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);//工厂方法}public class APizzaStore extends PizzaStore {    @Override    protected Pizza createPizza(String type) {        if (type.equals("cheese")) {            return new ACheesePizza();        } else if (type.equals("clam")) {            return new AClamPizza();        }        return null;    }}public class BPizzaStore extends PizzaStore {    @Override    protected Pizza createPizza(String type) {        if (type.equals("cheese")) {            return new BCheesePizza();        } else if (type.equals("clam")) {            return new BClamPizza();        }        return null;    }}

运行:

public static void main(String[] args) {        PizzaStore aPizzaStore = new APizzaStore();        PizzaStore bPizzaStore = new BPizzaStore();        Pizza aCheesePizza = aPizzaStore.orderPizza("clam");        System.out.println("name : " + aCheesePizza.getName() + "\n");        Pizza bClamPizza = bPizzaStore.orderPizza("cheese");        System.out.println("name : "+ bClamPizza.getName() + "\n");    }