下面用一个实例来说明工厂模式.

案例:一个视频网站,其中的一个列表页中有个分类导航,需要按类型来查询出相应的视频.这里就定义为:体育,娱乐。取视频并不是简单的依靠类似分类表这样查询,可能查询的方法迥然不同。为了使这个模块具有可扩展性,我在这分别应用工厂模式来设计,看下他们的好处。

工厂模式在设计模式中可谓是个大牌了,应用十分广泛.它一般包含三种方式:

1:简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。它又称为静态工厂方法模式,属于类的创建型模式。简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

简单工厂模式的UML类图

简单工厂模式实例:

1:统一的接口IManageList,申明一个取视频信息的方法。

public interface IManageList
          {
               DataTable getInformationList();

}

2:体育视频类。

  public class sportsList:IManageList
          {
               DataTable getInformationList()
               {//具体方法省略;}
          }

3:娱乐视频类。

public class amusementList:IManageList
          {
               DataTable getInformationList()
               {//具体方法省略;}
          }

4:工厂类。

public class simpleFactory
          {
                 public static IManageList createInstance(string stype)
                  {
                      IManageList list=null;
                      if(stype=="体育")
                      {list=new sportsList();}
                      
                      return list;
                  }
          }

5:client:

IManageList list=simpleFactory.createInstance("体育");
             DataTable dr=list.getInformationList();

2:工厂方法:工厂方法模式的思想:使一个类的实例化延迟到子类。定义一个用于创建对象的工厂类,由其决定实例化同一抽象类派生出来的具体类。此模式主要包括三个角色:工厂类,抽象类(接口),具体类。
           
         工厂方法类图:
              

工厂方法实例: 

1:统一的接口IManageList,申明一个取视频信息的方法。

public interface IManageList
              {
                  DataTable getInformationList();
              }

2:工厂基类。

public abstract class ManageList
               {
                     public abstract IManageList createInstance(string stype);
               }

3:具体工厂类。

public class methodFactory:ManageList
               {
                    public override IManageList createInstance(string stype)
                    {//具体代码省略}
               }

4:client:

methodFactory f=new methodFactory();
             IManageList list=f.createInstance("体育");
             DataTable dr=list.getInformationList();

3:抽象工厂

工厂方法的使用者可能会面临两种情况:第一种情况是对于某个产品,我清楚地知道应该使用哪个具体工厂为我服务,于是,我实例化该具体工厂,生产出具体的产品来。第二种情况,我只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为我生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

两种情况下具体的实现是不一样的,对于第一种情况,很可能是产品和生产者(工厂)各有一个公共接口,然后不同的具体工厂生产出对应不同的产品,二者出现平行的类结构。第二种情况各个具体生成者的共同父类通过方法的形式对外提供一个接口,返回哪个具体工厂实例的判断逻辑在该方法中实现,使用者通过调用该方法得到具体的工厂实例。

抽象工厂类图:

抽象工厂一般通过工厂方法来实现(还可以通过原型来构造),如果将工厂方法比作一个独立的小厂房,那么抽象工厂就是一个大集团了,在它旗下,集合了很多工厂,虽然生成不同的产品,但是都有该集团的徽号。譬如说,虽然lenovo的鼠标键盘是罗技的,显示器是philips做的,但是都打上了联想的标志。我们买了一套联想的PC,就整套都带有联想的风格,这跟Dell是不一样的。我们平时所说的“look and feel”也就这个道理。你相要哪种风格,就看你选的是哪个集团了。

抽象工厂实例:我们如果扩展一下上面取视频信息的过程,把这部分模块化。如果不是取视频信息而是读取新闻呢,这样工厂方法就不合适了,我们可以定义一个工厂超类来管理他们的子工厂类,提供统一的接口,这样就可以扩展系统功能了。

总结:这三种实现方式各有各的好处。从类图上面来看,根据我介绍的顺序来看,他们越来越复杂,可见他们的功能也是越来越强大。扩展性一个比一个强,解藕能力也是长江后浪推前浪。我们可以像用.net中的服务器绑定控件(Reapeter,DataList,GridView)一样来应用工厂模式,不选最复杂的,只选最适合自己的。

本人对于模式只属于学习阶段,如果有什么地方说错了,还忘大家指教。:)
        
     :本文参考以下文章:
          http://hi.baidu.com/daping_zhang/blog/item/bd85d4397a1437f33a87ce0f.html

转载于:https://www.cnblogs.com/ASPNET2008/archive/2008/05/21/1203996.html

老生常谈:工厂模式兄弟姐妹相关推荐

  1. 老生常谈:抽象工厂模式

    在创建型模式中有一个模式是不得不学的,那就是抽象工厂模式(Abstract Factory),这是创建型模式中最为复杂,功能最强大的模式.它常与工厂方法组合来实现.平时我们在写一个组件的时候一般只针对 ...

  2. 【Spring】工厂模式解耦

    问题: 程序的耦合    耦合:程序间的依赖关系    包括:类之间的依赖       方法之间的依赖 解耦:降低程序之间的耦合关系    实际开发:编译期不依赖,运行期才依赖    解耦思路:    ...

  3. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  4. 大话设计模式之简单的工厂模式

    第一章:代码无错就是优-简单的工厂模式 先建立一个计算类Operation Operation.h文件 @interface Operation : NSObject@property(nonatom ...

  5. 设计模式之简单工厂模式

    一.概述 工厂模式具体包括了简单工厂.工厂方法.抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF的23中模式.   但是它是理解其它的工厂模式的一个很好 ...

  6. 基础设计模式:单例模式+工厂模式+注册树模式

    单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景: 一般数据库实例都会用单例模式 实现: 单例设计模式就是要一个类只能实例化一个对象. 要想让一个类只能实 ...

  7. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...

    在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV, ...

  8. getinstance方法详解_二、设计模式总览及工厂模式详解

    二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...

  9. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

最新文章

  1. YOLO v1到YOLO v4(上)
  2. Javascript 装饰器极速指南
  3. 如家快捷酒店和星级酒店的区别
  4. [转][自勉]程序员困境:底层编码能力正逐步丧失
  5. 图解notepad++插件使用
  6. Android之java.lang.ClassCastException: *****cannot be cast to*******
  7. vs2017修改服务器地址大全,vs2017更改默认pip安装服务器地址
  8. java内嵌浏览器插件
  9. MarkdownPad2安装Awesomium SDK-Windows官方链接
  10. 详细了解一下股票量化交易接口股
  11. 怎样将图片制作转换圆形图片
  12. 弱水三千的由来(转)
  13. Shamir秘密共享算法
  14. 美团CAT客户端集成
  15. nafxcw.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined问题解决
  16. 哥:我要嫁给你!(让人巨感动)
  17. mysql缩写月名转换_mysql数据库时间、字符串类型互转
  18. 微软大佬的校招面试总结
  19. 查看端口占用情况以及如何解除端口占用
  20. 2022-2027年中国品牌连锁酒店行业发展前景及投资战略咨询报告

热门文章

  1. 【maven】修改编译得到的文件名
  2. vb链接mysql登录界面_求大神!有谁会用VB设计用户登陆界面连接到数据库
  3. PYG教程【三】对Cora数据集进行半监督节点分类
  4. 从零开始学习docker(十七)Swarm mode ---service
  5. 科技公司最爱的 50 款开源工具,你都用过吗?
  6. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-tf.keras函数式API-08
  7. for vue 一行2列_JAVA基础练习试题(2)蓝桥杯 附源代码
  8. D3js(五):tooltips
  9. window 10下 Spark 安装简单使用
  10. ubuntu 构建 deb 安装包