工厂模式 - 简单工厂模式

1. 基本概念

  • 简单工厂模式属于创建型模式,是工厂模式的一种,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例
  • 定义了一个创建对象的类,由这个类来封装实例化对象的代码
  • 在软件开发中,当我们会用到大量的创建某类的对象的时候,就会使用该模式

2. 一个例子

有一个披萨项目,要便于披萨种类的扩展,便于维护
① 披萨的种类很多(如GreekPizza,CheesePizza等)
② pizza的制作有prepare,break,cut,box
③ 完成披萨店订购功能

2.1 最初的想法

因为有很多不同种类的pizza,所以为他们抽象出来一个pizza抽象类里面有pizza的prepare,break,cut,box公有方法,再对具体的pizza继承pizza抽象类,实现相应的方法

Pizza抽象类

public abstract class Pizza {
    protected String name;
    /**
     * 每种pizza都有自己的原材料,所以prepare方法应该是抽象的由子类实现
     */
    public abstract void prepare();

    /**
     * bake cut box方法大同小异可以在这里一起实现
     */
    public void bake(){
        System.out.println("bake");
    }

    public void cut(){
        System.out.println("cut");
    }

    public void box(){
        System.out.println("box");
    }
}

两个具体实现类

public class CheesePizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("给CheesePizza准备原材料");
    }
}

public class GreekPizza extends Pizza {
    @Override
    public void prepare() {
        System.out.println("给GreekPizza准备原材料");
    }
}

还需要一个PizzaStore来订购Pizza的订单,当我们新建一个订单就会完成对一个pizza的定制

PizzaStore类

public class PizzaStore{
    public OrderPizza(String type){
        Pizza pizza = null;
        if(type.equals("CheesePizza")){
            pizza = new CheesePizza();
        }
        if(type.equals("GreekPizza")){
            pizza = new GreekPizza();
        }
        if(pizza!=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}

可以看到只要产生了一个OrderPizza的订单,它的构造器就完成了一个pizza的定制

2.2 简单工厂模式改进

违背了设计模式的开闭原则
可以想到上面的代码是有问题的,如果这个时候我新增了一个pizza的具体类,那么为了生产这个pizza,我需要在OrderPizza 里面修改源码,新增if判断生产新增pizza

这样会产生什么问题呢?
我们可能有多个OrderPizza店面,那么如果增肌了一个pizza种类,我们所有的OrderPizza都要改变

改进思路
修改代码我们可以接受,但是希望只修改一处代码,而不是向上面那样修改所有的OrderPizza,根据这个思路我们可以把创建Pizza对象封装到一个类中,当我们有了新的Pizza对象的时候,只需要修改创建Pizza类就行,其他答复不用修改,这就是简单工厂模式

在这里插入图片描述
简单工厂类

public class SimpleFactory {
	//根据type返回pizza对象
    public Pizza createPizza(String type){
        Pizza pizza = null;
        if(type.equals("CheesePizza")){
            pizza = new CheesePizza();
        }
        if(type.equals("GreekPizza")){
            pizza = new GreekPizza();
        }
        return pizza;
    }

}

PizzaStore聚合SimpleFactory

public class PizzaStore{
	//为PizzaStore加上了SimpleFactory的引用
    SimpleFactory simpleFactory;
	
    public void PizzaStore(SimpleFactory simpleFactory) {
        this.simpleFactory = simpleFactory;
    }
	
    public OrderPizza(String type){
        Pizza pizza = null;
        pizza = simpleFactory.createPizza(type);
        if(pizza!=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}

这也就完成了简单工厂模式

静态工厂模式
简单工厂模式也可以叫静态工厂模式,因为我们完全可以把上面的工厂中的createPizza方法写成静态的,这样我们调用的时候就可以通过类去创建

3. 还可以改进

如果生产的方法发生改变,那么就要进SimpleFactory类中对createPizza方法进行改变,很明显违背了对扩展开发,对修改封闭

改进方法
把SmpleFactory定义为一个接口,再去继承他实现生产不同披萨的工厂

SimpleFactory接口

public interface SimpleFactory {
    public Pizza createPizza();

}

两个具体工厂

public class CheesePizzaFactory implements SimpleFactory {
    @Override
    public Pizza createPizza() {
        Pizza pizza = new CheesePizza();
        return pizza;
    }
}
public class GreekPizzaFactory implements SimpleFactory {
    @Override
    public Pizza createPizza() {
        return new GreekPizza();
    }
}

PizzaStore

@Data
public class PizzaStore{
	//为PizzaStore加上了SimpleFactory的引用
    SimpleFactory simpleFactory;
	
    public void PizzaStore(SimpleFactory simpleFactory) {
        this.simpleFactory = simpleFactory;
    }
	
    public OrderPizza(){
        Pizza pizza = null;
        pizza = simpleFactory.createPizza();
        if(pizza!=null){
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }
}

这样主需要确定工厂就可以生产出想要的Pizza,而且满足开闭原则,想新产新的pizzza只需要创建新的Factory即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值