[094]工厂模式

简单的工厂

简单工厂即通过另外一个工厂来实例化对象具有共同基类的一组对象,这样完全不需要知道具体类的类名就可以直接实例化。

class product{  
}

class ConcreteProductA extends product{ 
}

class ConcreteProductB extends product{ 
}

class Factory
{
  createConcreteProduct(String productType);
  {
    if (productType == A)
    {
      return new ConcreteProductA();
    }
    if (productType == B)
    {
      return new ConcreteProductB();
    }
  }
}

工厂方法模式

从简单工厂例子引申,我们把创建ConcreteProductA,ConcreteProductB的实例放在具体的工厂中去。螺丝放在螺丝的工厂、轮胎放在轮胎的工厂。

abstract class  abstractFactory{
    createContreteProduct();
};
class AFactory extends abstractFactory {};
class BFactory extends abstractFactory {};

我们想象以下场景:

在简单工程里如果你需要创建productC那么需要修改Factory类,但是如果是工程方法,则只需要增加一个CFactory即可,这样更符合“开放闭合”原则。
对于工厂方法模式其代码为:class CFactory extends abstractFactory {}; // 增加一个CFactory来解决
对于简单工厂,其具体代码为: class Factory{ createConcreteProduct(String productType); { if (productType == A) ... if (productType == C) { return new ConcreteProductC(); } } }

工厂方法在实际中的应用

在pass平台元数据访问层中访问的数据有多种多样,比如有mysql的,有postgres的,有rest访问的。
在系统中我们通过dispatcher来分发不同类型的数据处理,其具体代码如下:

ObjectDataDispatcher implement IObjectDataService{
   create(IObjectData objectData,String type)
  {
     IObjectDataService dataService= IObjectDataServiceFactory.getInstance(type); //这里用的就是简单工厂方法
     //如果type是rest,那么dataService获取的就是AbstractRestDataService
     dataService.save(objectData)
  }
}

在阅读源代码的时候 如果对这个工厂模式有一些梳理,那么就能够想到写代码作者背后的意图,比如这里是通过工厂方法来分别创建 rest/postgres不同的dataservice,进而达到访问不同数据的目的。

你可能感兴趣的:([094]工厂模式)