工厂模式

  一、概述

  定义:工厂模式定义了一个创建产品对象的接口,由子类决定要实例化的是哪一个具体的产品类。工厂模式是代替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");
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值