设计模式学习: 工厂模式
来源:互联网 发布:手机淘宝页面设计 编辑:程序博客网 时间: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里,通过传入的参数进行区分
工厂模式将工厂类派生出几个不同的子工厂类,通过调用不同的工厂类进行区分, 相比于简单工厂好处是增加新的产品时不需要修改原来的工厂代码了,缺点是会多出好多工厂类来
抽象工厂模式应用于更复杂的场景当中, 一个工厂可以生产一系列不同但是相关的产品(学名产品族),
就实际应用来说,越简单的越好用,大部分情况简单工厂模式就可以解决问题了.
- 设计模式学习-工厂模式
- 设计模式学习: 工厂模式
- 设计模式学习>>>>>>工厂模式
- 设计模式学习:工厂模式
- 设计模式学习-工厂模式
- 设计模式学习:工厂模式
- 设计模式学习--工厂模式
- 学习设计模式-方法工厂设计模式
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式入门学习之工厂模式(工厂方法模式)
- 设计模式学习之工厂模式(简单工厂模式)
- 设计模式学习(2)工厂模式,抽象工厂模式
- 设计模式学习之简单工厂模式和工厂模式
- 设计模式学习-简单工厂
- 设计模式学习--抽象工厂
- 设计模式学习--工厂方法
- 设计模式入门学习之工厂模式
- 设计模式学习--工厂方法模式
- HDU1798 简单高中的计算几何题= =。正余弦定理的综合应用么。。。
- thinkpad x61 无线网卡驱动 debian 7 下配置 安装
- 0.driverbase-字符串、文件、注册表相关函数
- 全表扫描
- PHP新手开发必会碰到的问题
- 设计模式学习: 工厂模式
- window快捷键
- 极大极小过程 UVA 10838 - The Pawn Chess
- Python中字符串的总结
- [数论]POJ 2115/HOJ 1787 C Looooops 扩展欧几里得算法
- 九度oj 题目1350:二叉树的深度
- 设置环境变量
- Oracle的索引类型总结
- Mybatis连接MySql时,出现的MySql版本问题(read only数据库事务)