文章标题

工厂模式

工厂模式是用来封装对象的创建。


简单工厂

简单工厂只是一编程习惯。

比如说下面的一段代码, 为了实现根据不同的客户需求制作不同的pizza。
Pizza orderPizza(String type){
    Pizza pizza;
    //可能会改的地方
    if("cheese".equals(type)){
        pizza = new CheesePizza();
    }else if("greek".equals(type)){
        pizza = new GreekPizza();
    }else if("pepperoni".equals(type)){
        pizza = new PepperoniPizza();
    }
    //一般不会改
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
}
将可能会改的地方抽出来,使用简单工厂可以这么写:
public class PizzaStore(){
    SimplePizzaFactory factory;
    public PizzaStore(SimplePizzaFactory factory){
    this.factory = factory;
    }
    public Pizza orderPizza(){
        Pizza pizza = factory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

}
public class SimplePizzaFactory{
    public Pizza createPizza(String type){
        Pizza pizza;
        if("cheese".equals(type)){
            pizza = new CheesePizza();
        }else if("greek".equals(type)){
            pizza = new GreekPizza();
        }else if("pepperoni".equals(type)){
            pizza = new PepperoniPizza();
        }
        return pizza;
    }
}
使用简单工厂的好处是:
  1. 代码可以复用,生成pizza的方法createPizza()可以被其他类调用。
  2. 当生成pizza的方法改动时,比如说有新的pizza类型,只需改动createPizza()的内部实现,一次修改,多处生效。

工厂方法模式

工厂方法模式是另外一种封装对象的创建的模式。
它通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。

比如说下面一段代码:

有一个抽象创建者类PizzaStore,类里有一个抽象方法createPizza(), 让子类实现此方法制造产品。抽象创建者只是提供了一个接口,他并不需要知道具体在制造什么产品
子类是具体创建者。子类可以创建自己风格的产品。比如纽约风味和芝加哥风味的芝士披萨(虽然我也不知道他们有什么不同,就比如广东口味的麻辣烫和湖南口味的麻辣烫吧)

public abstract class PizzaStore{
    public Pizza orderPizza(String type){
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
    //工厂方法 - 定义成抽象方法,由子类决定具体实现
    abstract Pizza createPizza(String type);
}
public class NYStylePizzaStore(){
    public Pizza createPizza(String type){
        Pizza pizza;
        if("cheese".equals(type)){
            pizza = new NYStyleCheesePizza();
        }else if("greek".equals(type)){
            pizza = new NYStyleGreekPizza();
        }else if("pepperoni".equals(type)){
            pizza = new NYStylePepperoniPizza();
        }
        return pizza;

    }
}
public class ChicagoStylePizzaStore(){
    public Pizza createPizza(String type){
        Pizza pizza;
        if("cheese".equals(type)){
            pizza = new ChicagoStyleCheesePizza();
        }else if("greek".equals(type)){
            pizza = new ChicagoStyleGreekPizza();
        }else if("pepperoni".equals(type)){
            pizza = new ChicagoStylePepperoniPizza();
        }
        return pizza;

    }
}
实现类图

这里写图片描述

工厂方法不一定是抽象的,也可以在抽象创建者类中实现一个默认的工厂方法,然后又子类决定是否要覆盖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值