分类

工厂模式可以分为三类:

  • 简单工厂模式(Simple Factory) ---简单工厂实际是工厂方法的一种特例, 也可以就把简单工厂归类为工厂方法
  • 工厂方法模式(Factory Method) --- 在简单工厂上增加了工厂接口, 增加新的生产逻辑不必修改代码, 直接新增一个工厂实现
  • 抽象工厂模式(Abstract Factory) -- 工厂可以生产不同的一组对象, 即工厂提供多个方法, 每个方法可以生产一类同一类型对象; 没有关系的一组对象可以放到一个工厂生成;

    这三种模式从上到下逐步抽象,并且更具一般性。

    三个工厂相关模式区别:

  • 首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。

  • 从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端(只能创建同一个继承体系产品)。

此外, 工厂模式还有一个巨大优点, 方便拓展外部组建, 如果有一个第三方jar包,我们自己要拓展他的功能:

//抽象产品
interface Product{}
//具体产品
class ProductA implements Product{}
class ProductB implements Product{}
//工厂接口
interface Factory{
    Product getProduct();
}
//具体的工厂A,创造产品A
class FactoryA implements Factory{
    public Product getProduct() {
        return new ProductA();
    }
}
//具体的工厂B,创造产品B
class FactoryB implements Factory{
    public Product getProduct() {
        return new ProductB();
    }
}
/*   假设以上是一个第三方jar包中的工厂方法模式,我们无法改动源码   */
//我们自己特有的产品
interface MyProduct{}
//我们自己特有的产品实现
class MyProductA implements MyProduct{}
class MyProductB implements MyProduct{}
//我们自己的工厂接口
interface MyFactory{
    MyProduct getMyProduct();
}
//我们自己特有的工厂A,产生产品A
class MyFactoryA implements MyFactory{
    public MyProduct getMyProduct() {
        return new MyProductA();
    }
}
//我们自己特有的工厂B,产生产品B
class MyFactoryB implements MyFactory{
    public MyProduct getMyProduct() {
        return new MyProductB();
    }
}
/*  到这里是我们自己的一套工厂方法模式,去创造我们自己的产品,以下我们将以上二者组合   */
//我们使用组合的方式将我们的产品系列和jar包中的产品组合起来, 即新建一个组合工厂, 继承我们自己原有工厂接口and第三方组建接口
class AssortedFactory implements MyFactory,Factory{
    MyFactory myFactory;
    Factory factory;
    public AssortedFactory(MyFactory myFactory, Factory factory) {
        super();
        this.myFactory = myFactory;
        this.factory = factory;
    }
    public Product getProduct() {
        return factory.getProduct();
    }
    public MyProduct getMyProduct() {
        return myFactory.getMyProduct();
    }
}

results matching ""

    No results matching ""