设计模式学习: 工厂模式

来源:互联网 发布:手机淘宝页面设计 编辑:程序博客网 时间:2024/06/11 18:42

工厂模式是较常见的一种设计模式


一:基本特点:

工厂模式可分为简单工厂模式,工厂模式和抽象工厂模式,它们的思路和实现都很相似. 基本特点为至少包括以下三个类:

工厂类: 用new操作符创建各种产品类

抽象产品类: 各产品类的基类, 定义了产品的接口,

具体产品类: 抽象产品类的子类, 包含了具体实现

用户在使用时通过工厂类生成符合要求的产品对象,并赋给一个抽象产品类的指针. 通过多态自动调用正确的接口函数


二:主要思想

无论是那种工厂模式,其中心思想都是将业务逻辑与底层实现进行解耦. 

举个例子, 一个网站需要连接数据库, 那么如何建表,查表这些是业务逻辑, 而用mysql还是sql_server则是具体实现. 不用工厂模式的情况下两者是交叉出现的. 而我们想要的理想状态是: 当我们需要换一种数据库的时候不需要关心复杂的业务逻辑, 同样当我们写业务逻辑时也不需要知道底层如何实现,只要调用相应接口即可.

工厂模式利用面向对象的多态特性很好地解决了这个问题. 一个简单的实现如下:(简单工厂模式)


//工厂类class DBFactory{public:  static DBBase* create(string dbname)  {     if(dbname=="mysql")         return new mysqlDB;     if(dbname=="sql_server")         return new sql_serverDB;     return NULL;   }}; //抽象产品类class DBBase{    int insert(......)=0;    int select(......)=0;}//具体产品类class mysqlDB: public DBBase{    int insert(......){......}    int select(......){......}};class sql_serverDB: public DBBase{    int insert(......){......}    int select(......){......}};//用户调用{    DBBase* db = DBFactory::create("mysql");   //or sql_server     /* 业务逻辑         db->insert(...);        db->select(...);        ......     */};        

这样,当改变数据库的时候就不必与复杂的业务逻辑打交道了,同理做业务逻辑时也不必关心底层的实现.


三,几种工厂模式的区别

    前面说过工厂模式可分为简单工厂模式,工厂模式和抽象工厂模式(也有把简单工厂归为工厂模式的), 它们之间大同小异,无非是将判断逻辑放在不同地方而已(好吧,更深的原因我不懂).  

   简单工厂模式将判断逻辑直接放在生产方法create里,通过传入的参数进行区分

   工厂模式将工厂类派生出几个不同的子工厂类,通过调用不同的工厂类进行区分, 相比于简单工厂好处是增加新的产品时不需要修改原来的工厂代码了,缺点是会多出好多工厂类来

  抽象工厂模式应用于更复杂的场景当中, 一个工厂可以生产一系列不同但是相关的产品(学名产品族), 

  就实际应用来说,越简单的越好用,大部分情况简单工厂模式就可以解决问题了.


0 0
原创粉丝点击