设计模式之工厂模式系列(简单工厂,工厂模式,抽象工厂模式)

2014-11-24 02:25:49 · 作者: · 浏览: 0

每次在做功能时,都会考虑下具体的应该采用神马样的设计模式,今天索性就来整体地学习下我们常用的一些设计模式了,首先是我们的工厂模式系列,在这类模式中,主要分为了三大类:简单工厂模式,工厂方法模式以及抽象工厂模式,它们之间的不同:简单的工厂模式可以比做成一个工厂但是可以生产不同的物品,工厂模式就是不同的工厂生产不同的物件,而抽象工厂则是不同的工厂既可以生产相同的物件也可以生产不同的物件,个人的感觉就是一个比一个包含的范围广,一个比一个复杂,这个是必须的,下面我们就从最简单的开始。

1.简单工厂模式

这种模式在上面也提及到了,就是一个工厂生产不同的物件,工厂只有一个,而物件可以多个,代码如下:

#ifndef __SIMPLE_FACTORY_H
#define __SIMPLE_FACTORY_H
#include 
  
   
#include 
   
     using namespace std; using namespace boost; class Object { public: virtual void showName() = 0; }; class Watch : public Object { public: void showName() { cout<<"Watch"<
    
      obj1(factory.createObject(1)); obj1->showName(); shared_ptr
      obj2(factory.createObject(2)); obj2->showName(); return 0; }  

从上述代码中可以看到,简单工厂的最大的不足就是:生产线很单一,并且只有一个工厂,如果需要增加生产线的话,还的修改工厂方法,因此,在此基础上,工厂方法应运而生了,工厂方法相比简单工厂,其最大的特点就是如果要开启新的生产线的话,我可以建立新的工厂,而不是在已有的工厂里面添加生产线。

2.工厂模式

#ifndef __SIMPLE_FACTORY_H
#define __SIMPLE_FACTORY_H
#include 
       
        
#include 
        
          using namespace std; using namespace boost; class Object { public: virtual void showName() = 0; }; class Watch : public Object { public: void showName() { cout<<"Watch"<
         
           fac1(new WatchFactory); shared_ptr
           obj1(fac1->createObject()); obj1->showName(); shared_ptr
           
             fac2(new PenFactory); shared_ptr
             obj2(fac2->createObject()); obj2->showName(); return 0; } 

从上述代码中可以看出,工厂模式最大的问题就是每次新增加一个产品线就得新加一个工厂,这样的话代价就太大了,并且如果需要每个工厂即生产相同的品种的物品,又要生产不同品种的物品,上述的两种形式很难实现,下面就该抽象工厂出厂了。

3.抽象工厂

抽象工厂定义为提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,下面就来看看代码吧

#ifndef __SIMPLE_FACTORY_H
#define __SIMPLE_FACTORY_H
#include 
              
               
#include 
               
                 using namespace std; using namespace boost; class Object { public: virtual void showName() = 0; }; class Object1 { public: virtual void showName() = 0; }; class Watch : public Object { public: void showName() { cout<<"Watch"<
                
                 
#include "SimpleFactory.h"


int main()
{
    shared_ptr
                  
                    abFac1(new WatchFactory);
    shared_ptr
                    obj1(abFac1->createObject()); shared_ptr
                    
                      obj2(abFac1->createObject1()); obj1->showName(); obj2->showName(); shared_ptr
                     
                       abFac2(new PenFactory()); shared_ptr
                       obj3(abFac2->createObject()); shared_ptr
                       
                        obj4(abFac2->createObject1()); obj3->showName(); obj4->showName(); return 0; } 
                        

总结

工厂模式在实际的使用中界限不会很明显,其主要的目的就是为了实现抽象与接口分离,使得用户不用过多地关注起实现,而是专注于业务逻辑,因此工厂方法在一定程度上能够降低类之间的耦合度,上面的几个测试案例已经说明了这点,基本上通过调用抽象出来的接口接口完成相应的任务,起到了很好的封装作用。好了,本篇博文到此结束,多谢

如果需要,请注明转载,多谢

<script type="text/java script">
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
分享到: 更多
<script type="text/java script" id="bdshare_js" data="type=tools&uid=12732"> <script type="text/java script" id="bdshell_js"> <script type="text/java script"> var bds_config = {'snsKey':{'tsina':'2386826374','tqq':'5e544a8fdea646c5a5f3967871346eb8'}}; document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js cdnversion=" + Math.ceil(new Date()/3600000)
您对本文章有什么意见或着疑问吗?请到 论坛讨论您的关注和建议是我们前行的参考和动力
上一篇: Java学习笔记(九)――javabean
下一篇: 最后一页
相关文章
<script type="text/java script">BAIDU_CLB_fillSlot("182716");
<script type="text/java script">BAIDU_CLB_fillSlot("517916");
图文推荐
<iframe src="http://www.2cto.com/uapi.php tid=280632&catid=85&title=yei8xsSjyr3Wrrmks6fEo8q9z7XB0KOovPK1pbmks6ejrLmks6fEo8q9o6yz6c/zuaSzp8Sjyr2jqQ==&forward=http://www.2cto.com/kf/201402/280632.html" width="100%" height="100%" id="comment_iframe" name="comment_iframe" frameborder="0" scrolling="no">
<script type="text/java script">BAIDU_CLB_fillSlot("771057");
排行
热门
<script type="text/java script">BAIDU_CLB_fillSlot("406189");
<script type="text/java script">BAIDU_CLB_fillSlot("703749");
<iframe frameborder="0" name="Iframe1" src="http://www.2cto.com/bbsdy/index.html" width="100%" height="200"> 您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。
<script type="text/java script">BAIDU_CLB_fillSlot("182692");
文章
下载
读书
<script type="text/java script">BAIDU_CLB_fillSlot("771043");
<script type="text/java script"> <script language="java script" src="http://www.2cto.com/api.php op=count&id=280632&modelid=1"> <script type="text/java script">BAIDU_CLB_fillSlot("137946");
<script type="text/java script">BAIDU_CLB_fillSlot("333829");

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站<script type="text/java script"> var _bdhmProtocol = (("https:" == document.location.protocol) " https://" : " http://"); document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F1898984a3d796e86ad73ad1f4bc9f240' type='text/java script'%3E%3C/script%3E"));