什么时候用工厂模式-----转载

有一次讨论的时候,谈到了这一点:到底什么时候我们需要把类封装,并限制其必须使用工厂模式来创建实例。

一个理由是:当类的构造函数发生变化(名称变化,参数变化等)时,我们只需要更改工厂类中的一个函数就可以了。而不必search所有的构造函数名称并修改之。所以,一般情况下,我们最好都使用工厂模式封装。

果然是这样吗?

不用工厂模式,当名称变化时,确实需要search & replace。但是,难道一个模式被提练出来就是为了解决这个问题?!!似乎牛刀杀鸡了吧

那当 参数变化 时呢?

 函数的转入参数都变了,还想不改动所有的代码吗?!!

先来看看定义

---------------------------

Factory   Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory

---------------------------

显然上面的说法是不成立的。

如定义中说的,只有当无法预料所创建的实例时,才使用工厂模式。即:我们明确的计划不同条件下创建不同实例时,使用它。

经典的一个例子是:

日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。

另一个例子:

数据库访问类:访问可能是SQLSERVER、ORACLE等,用记可以选择创建访问不同的数据库。

下面的代码来自 GEOS3.0.0 (http://geos.refractions.net),非常著名的一个类库,很多软件正在使用它。

看它的实例创建方式正是采用了工厂模式,用户无法直接创建point,line.polygon等实例,而必须通过GeometryFactory类

不过,我个人认为这是对工厂模式的一种滥用:当创建point,line,polygon等实例时,有上面提到的实例不确定性吗?!!

[cpp] view plain copy

  1. Point* createPointFromInternalCoord(const Coordinate* coord,
  2. const Geometry *exemplar) const;
  3. /// Converts an Envelope to a Geometry.
  4. //
  5. /// Returned Geometry can be a Point, a Polygon or an EMPTY geom.
  6. ///
  7. Geometry* toGeometry(const Envelope* envelope) const;
  8. /// /brief
  9. /// Returns the PrecisionModel that Geometries created by this
  10. /// factory will be associated with.
  11. const PrecisionModel* getPrecisionModel() const;
  12. /// Creates an EMPTY Point
  13. Point* createPoint() const;
  14. /// Creates a Point using the given Coordinate
  15. Point* createPoint(const Coordinate& coordinate) const;
  16. /// Creates a Point taking ownership of the given CoordinateSequence
  17. Point* createPoint(CoordinateSequence *coordinates) const;
  18. /// Creates a Point with a deep-copy of the given CoordinateSequence.
  19. Point* createPoint(const CoordinateSequence &coordinates) const;
  20. /// Construct an EMPTY GeometryCollection
  21. GeometryCollection* createGeometryCollection() const;
  22. /// Construct the EMPTY Geometry
  23. Geometry* createEmptyGeometry() const;
  24. /// Construct a GeometryCollection taking ownership of given arguments
  25. GeometryCollection* createGeometryCollection(
  26. std::vector<Geometry *> *newGeoms) const;
  27. /// Constructs a GeometryCollection with a deep-copy of args
  28. GeometryCollection* createGeometryCollection(
  29. const std::vector<Geometry *> &newGeoms) const;
  30. /// Construct an EMPTY MultiLineString
  31. MultiLineString* createMultiLineString() const;
  32. /// Construct a MultiLineString taking ownership of given arguments
  33. MultiLineString* createMultiLineString(
  34. std::vector<Geometry *> *newLines) const;
  35. /// Construct a MultiLineString with a deep-copy of given arguments
  36. MultiLineString* createMultiLineString(
  37. const std::vector<Geometry *> &fromLines) const;
  38. /// Construct an EMPTY MultiPolygon
  39. MultiPolygon* createMultiPolygon() const;
  40. /// Construct a MultiPolygon taking ownership of given arguments
  41. MultiPolygon* createMultiPolygon(std::vector<Geometry *> *newPolys) const;
  42. /// Construct a MultiPolygon with a deep-copy of given arguments
  43. MultiPolygon* createMultiPolygon(
  44. const std::vector<Geometry *> &fromPolys) const;
  45. /// Construct an EMPTY LinearRing
  46. LinearRing* createLinearRing() const;
  47. /// Construct a LinearRing taking ownership of given arguments
  48. LinearRing* createLinearRing(CoordinateSequence* newCoords) const;
  49. std::auto_ptr<Geometry> createLinearRing(
  50. std::auto_ptr<CoordinateSequence> newCoords) const;
  51. /// Construct a LinearRing with a deep-copy of given arguments
  52. LinearRing* createLinearRing(
  53. const CoordinateSequence& coordinates) const;
  54. /// Constructs an EMPTY <code>MultiPoint</code>.
  55. MultiPoint* createMultiPoint() const;
  56. /// Construct a MultiPoint taking ownership of given arguments
  57. MultiPoint* createMultiPoint(std::vector<Geometry *> *newPoints) const;
  58. /// Construct a MultiPoint with a deep-copy of given arguments
  59. MultiPoint* createMultiPoint(
  60. const std::vector<Geometry *> &fromPoints) const;
  61. /// /brief
  62. /// Construct a MultiPoint containing a Point geometry
  63. /// for each Coordinate in the given list.
  64. MultiPoint* createMultiPoint(
  65. const CoordinateSequence &fromCoords) const;
  66. /// Construct an EMPTY Polygon
  67. Polygon* createPolygon() const;
  68. /// Construct a Polygon taking ownership of given arguments
  69. Polygon* createPolygon(LinearRing *shell,
  70. std::vector<Geometry *> *holes) const;
  71. /// Construct a Polygon with a deep-copy of given arguments
  72. Polygon* createPolygon(const LinearRing &shell,
  73. const std::vector<Geometry *> &holes) const;
  74. /// Construct an EMPTY LineString
  75. LineString* createLineString() const;
  76. /// Copy a LineString
  77. std::auto_ptr<LineString> createLineString(const LineString& ls) const;
  78. /// Construct a LineString taking ownership of given argument
  79. LineString* createLineString(CoordinateSequence* coordinates) const;
  80. std::auto_ptr<Geometry> createLineString(
  81. std::auto_ptr<CoordinateSequence> coordinates) const;
  82. /// Construct a LineString with a deep-copy of given argument
  83. LineString* createLineString(
  84. const CoordinateSequence& coordinates) const;
时间: 2024-12-29 19:02:56

什么时候用工厂模式-----转载的相关文章

java 简单工厂模式 转载

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 那么简单工厂模式是在什么场景下使用呢,下面就以本人的理解举例说明: 就拿登录功能来说,假如应用系统需要支持多种登录方式如:口令认证.域认证(口令认证通常是去数据库中验证用户,而域认证则是需要到微软的域中验证用户).那么自然的做法就是建立一个各种登录方式都适用的接口,如下图所示: public interface Login { //登录验证

.Net简单工厂模式,工厂模式,抽象工厂模式实例

1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类. 抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.实例 用工人种蔬菜的例子来说明,蔬菜植物的产品器官有根.茎.叶.花.果等5类,因此按产品器官分类也分成5种,分别是根菜类,茎菜类,叶莱类,花菜类以及果菜类.我们以根菜类,茎菜类为例,

Java设计模式之工厂模式(Factory模式)介绍(转载)

原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工厂.Java工厂模式举例等内容,需要的朋友可以参考下 工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经

比较好的三层的理解(转载)---基于工厂模式

在项目开发时,有时候可能会增加或修改新的数据库,比如,刚开始我们项目用SQL Server 数据库,但后来需要用Oracle 数据库,或者说在某些情况下需要用Oracle 来代替SQL Server 数据库,甚至两种情况会同时存在,但数据库访问方面 Oracle 和SQL Server 是不同的,它们的语句写法不同,甚至所示哟哦那个的.NET Framework  数据提供程序也是不同的,那应该怎么办呢? 1. 新增数据访问层 我们不修改原来的DAL的代码,可以将原来的项目命名为SQLServe

JAVA 工厂模式(转载)

一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品:             这三种模式从上到下逐步抽象,并且更具一般性.             GOF在<

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

简单工厂模式例子

/** 简单工厂模式:一个工厂生产三类汽车 高档汽车(TopCar).中等汽车(MidCar).低档汽车(LowCar) 生产汽车需要方法,定义一个ICar接口类定义其中的方法名. 三种汽车去实现这些方法. 定义一个工厂类 负责创建汽车对象 以上就是一个简单工厂模式的雏形.即程序开发者不用反复创建对象,只需要调用工厂模型便可以创建相应的对象. 注意用public定义的类,应该是一个独立的*.java文件.这里没有作区分. */ public interface ICar{ //该类是定义创建汽车

创建型模式--抽象工厂模式

概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.  适用性 1.一个系统要独立于它的产品的创建.组合和表示时. 2.一个系统要由多个产品系列中的一个来配置时. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用时. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现时.  参与者 1.AbstractFactory 声明一个创建抽象产品对象的操作接口. 2.ConcreteFactory 实现创建具体产品对象的操作. 3.AbstractProduct 为一

C# 设计模式巩固 - 简单工厂模式

前言 设计模式的文章很多.鄙人不才文笔也不咋地.写这篇只为巩固下基础知识,万一不小心帮到了您,是我莫大的荣幸!写的不好欢迎码友指正,废话结束开始进入正题. 介绍 - 简单工厂模式 官方定义:(尴尬~貌似没啥官方定义,下面摘自百度百科)简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一