# 工厂模式
in inbox with 0 comment

# 工厂模式

in inbox with 0 comment

设计模式

在之前的简单工厂模式中,虽然能够比较好的处理封装创造对象的过程,但是明显的,每当要添加一种新的面包时候,就需要修改简单类工厂,增加case分支(或者是if else分支),这样最大的问题就是不满足于开闭原则。

工厂模式-简单工厂模式的升级版

GOF对于工厂方法模式的定义是:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法将一个类的实例化延迟了他的子类。

来看他的结构图

屏幕快照 2018-10-17 下午4.25.34.png

简单来说,每个工厂负责实例化本工厂产生的产品,在客户端编写代码时候都按照父类(接口)来进行编写,因此,无论实例化了哪一个类,都可以直接替换父类(依赖倒转原则),从而达到可以复用代码的目的。

代码修改

本代码是在简单工厂模式的基础上修改而来的。简单工厂,请移步前一篇文章。

//首先来看工厂的接口
public interface IFactory{

    BreadMaker CreateBread();
}
//不同的面包工厂建立一个具体的工厂方法来实现这个借口
public class BlackBreadFactory implements IFactory{

    //覆盖父类的抽象方法
    public BreadMaker CreateBread(){

        return new BlackBread();
    }
}

public class HoneyBreadFactory implements IFactory{

    //覆盖父类的抽象方法
    public BreadMaker CreateBread(){

        return new HoneyBread();
    }
}



/*

客户端的代码实现
*/
public static void main(String[] args){

    BreadMaker breadMaker;
    System.out.Println("小面的面包店开业了!");

    //顾客上门来买面包,要黑面包
    IFactory breadFactory = new BlackBreadFactory();
    breadMaker = breadFactory.CreateBread();
    breadMaker.getBread();

}

需要注意的是:
在客户端中,如果需要创建一个对象的话,那么首先实例化一个工厂(子工厂),接着用这个工厂去创造相应的对象就可以了。

工厂模式和简单工厂模式的对比

简单工厂模式违反了开放-封闭原则,但是保持了封装对象创建的过程。
可以说工厂模式就是简单工厂模式的升级版,是简单工厂的进一步抽象和推广。但是工厂模式也有缺点:每增加一个产品,就要相应的添加一个产品工厂类,增大了额外的开发量。

工厂模式适用于以下三种情况

如何选择

要取决于具体的应用,就像是两个模式的名称就可以看出来,对于一些比较简单的应用,“产品”类比较少的时候,使用简单工厂模式就可以满足要求,而对于“产品”比较丰富的应用,过多的分支不利于程序的维护,这时候应该选择工厂模式来降低程序的维护量。

Responses