本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。
简单工厂
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
代码示例:
public interface Api { void doSomething(String thing);}public class ImpA implements Api { @Override public void doSomething(String thing) { System.out.println("ImpA thing ="+thing); }}public class ImpB implements Api{ @Override public void doSomething(String thing) { System.out.println("ImpB thing ="+thing); }}public class Factory { public static Api createApi(int condition){ Api api = null; if (condition==1) api = new ImpA(); if (condition == 2) { api = new ImpB(); } return api; }}/** * 简单工厂本质:选择实现! * * 简单工厂优点: * * 1:帮助封装 * 2:解耦 * * 简单工厂缺点: * * 1:不方便扩展子工厂, * 2:增加客户端难度,因为客户端要知道参数代表的 功能和含义,也部分暴露了内部实 现,这种情况建议使用可配置的方式实现。 */public class Client { public static void main(String[] args) { Api api = Factory.createApi(2); api.doSomething("正在使用简单工厂"); }}
工厂方法
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
public interface FactoryMethod { Product createProduct();}public class FactoryA implements FactoryMethod { @Override public Product createProduct() { return new CreateProductA(); }}public class FactoryB implements FactoryMethod { @Override public Product createProduct() { return new CreateProductB(); }}public class CreateProductA implements Product { @Override public void opration1() { System.out.println("ProductA.opration1"); } @Override public void opration2() { System.out.println("ProductA.opration2"); }}public interface Product { void opration1(); void opration2();}public class CreateProductB implements Product { @Override public void opration1() { System.out.println("ProductB.opration1"); } @Override public void opration2() { System.out.println("ProductB.opration2"); }}
FactoryMethod factory = new FactoryA();Product product = factory.createProduct();product.opration1();
抽象工厂
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法