工厂模式主要是为创建对象提供一个接口,通常在类或类的静态方法中去实现。工厂模式家族中主要有这三个成员:简单工厂模式,工厂方法模式和抽象工厂模式。
一、简单工厂模式
简单工厂模式,是指专门创建一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类,它又称为静态工厂方法模式。它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品继承一个父类或接口)的实例。
简单工厂模式,顾名思义是工厂模式家族中最简单实用的模式。从下面计算器的结构图当中我们就能看出来了!
换句话来说,就相当于是自己独立的创建了一个工厂,而在这个工厂是用来具体生产出某种东西(也就是对类的实例),用户用这个工厂的时候,只需要发送命令即可(即是加法还是减法等命令)而无需知道它是怎么生产出来的。也就是说,你让这个工厂生产出什么,它就生产出个具体的模型出来给你。
二、工厂方法模式
工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
例如,我们要生产苹果、橙子、葡萄等水果,如果只有一个工厂就不能满足要求,我们需要另外的苹果厂,橙子厂,葡萄厂等,需要苹果时,就调用苹果厂进行生产。但是,不管是苹果厂,还是橙子厂,总之是工厂就行了。这样我们就将它们统一抽象为水果厂。下面是工厂方法模式的结构图:
工厂方法模式 PK 简单工厂:
简单工厂的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对于客户端来说,去除了与具体产品的依赖。
而工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。如果要增加功能,我们只需要修改客户端就OK了!工厂方法模式的优点主要是实现了开放—封闭原则,在不改变工厂的前提下增加新产品。
三、抽象工厂模式
抽象工厂模式(Abstrate Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
结构图:
换句话说,当我们希望得到的是一系列的对象而不仅仅是单个对象的时候,我们就可以使用抽象工厂模式了。
抽象工厂模式,主要是针对不同的产品等级结构,例如上面的结构图,ConceteFactory1 生产出来的产品是ProductA1和ProductB1这一组产品。而ConcreteFactory2生产出来的是ProductA2和ProductB2这组产品。
而工厂方法模式针对的一个产品等级结构,在工厂方法模式的抽象基类中,只有一个子类,抽象工厂模式却有多个,并且每个子类之间都有相互关联和依赖关系。
抽象工厂模式好处:
第一,易于交换产品系列,由于具体工厂类,在一个应用中只需要再初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同得到产品配置。第二,它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
简单工厂模式、工厂方法模式和抽象工厂模式都属于设计模式的创建型模式,各有优缺点,具体使用哪种模式,根据不同的情况进行选择。