工厂方法

转载 2012年03月28日 17:32:58

摘选自:《设计模式Java手册》

工厂方法模式的核心思想

一个方法能够创建一个对象,这本身并不意味着该方法是工厂方法模式的一个例子。总而言之,实现了工厂方法模式的特征是:

  • 该方法创建了一个新对象
  • 该方法的返回类型为一个抽象类或接口
  • 有若干个类实现了上述抽象类型
Arrays.asList()方法实例化了一个对象,并且其返回类型为一个接口,有的人可能会认为这种方法也是工厂模式的一个例子。尽管使用这类方法的用户也不知道到底要实例化哪个类,但是它不是工厂方法模式的例子。工厂方法模式的核心思想是:让对象的创建者代替用户确定应该实例化哪一个类。

决定要实例化的类

假定A公司计划允许客户赊购焰火制品。在赊购系统的早期设计阶段,我们负责开发一个CreditCheckOnline类,该类用于审查一名客户是否有资格向A公司赊购一定数额的产品。

开发开始后,我们发现赊购代理偶尔会离线。项目分析人员决定,在这种情况下,系统应为呼叫中心代表提供一个对话框,呼叫中心代表通过想客户询问对话框上列出的问题来确定是否允许该客户进行赊购。针对这个设计,我们创建了一个CreditCheckOffline类。起初,我们设计了两个类,CreditCheckOnline和CreditCheckOffline,他们都实现了同一个方法:creditLimit(id:int) : double

这样,无论联机赊购代理是否在线,我们都可以根据图1所示的两个类确定用户的限额。现在的问题是,这两个类的用户必须知道该实例化哪个类。但是,现在只有我们知道赊购代理是否在线!

在这个时候,我们可以让这两个类实现一个接口,并创建一个方法,此方法的返回类型为这个接口。具体而言,我们可以:
  • 创建一个包含creditLimit()方法的接口CreditCheck。
  • 修改上面两个赊购审查类的声明,使他们实现CreditCheck接口。
  • 创建一个CreditCheckFactory类,在该类中提供createCreditCheck()方法,此方法的返回类型为 CreditCheck接口。
这样,在实现createCreditCheck()方法的时候,我们可以根据赊购代理的状态决定实例化哪个类。通过应用工厂模式,无论赊购代理是否在线,客户代码都能够通过调用createCreditCheck()方法获取赊购对象。

工厂方法(python)

简单工厂模式的最大优点就是工厂类内部包含了必要的逻辑判断,客户端只要提供选择条件即可,这样客户端就不需要知道具体产品的信息了。 但是每次增加产品就要修改工厂类,违背了“开放-封闭”原则。 所以,有...
  • ponder008
  • ponder008
  • 2011年10月09日 13:23
  • 4119

php工厂方法模式

CleverCode最近在看工厂方法模式。 1 模式介绍  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 2 模式中的角色     2.1...
  • CleverCode
  • CleverCode
  • 2016年11月05日 12:39
  • 1415

设计模式【工厂方法模式】

本文主要是分享自己在学习设计模式过程中的心得与记录,有什么不当之处,望各位有心关注的看官,给予指证与说明。本文主要讲述【工厂方法模式】,望各位细细品读。【转载使用,请注明出处:http://blog....
  • ma_hoking
  • ma_hoking
  • 2014年09月23日 22:34
  • 1222

iOS中类工厂方法介绍

类工厂的主要理念在于产生并返回一个特定类的实例对象,并在产生对象时尽可能的预填充数据。相比调用 alloc/init 再设置特性,使用类工厂的一个显而易见的好处就是,你的代码将会缩短很多。   ...
  • guodong10518
  • guodong10518
  • 2015年03月09日 16:31
  • 1293

JS学习十七天----工厂方法模式

工厂方法模式 前言 今天自己看了一下自己写的部分博客,发现写的好丑....开始注意自己的排版!!但是偏亮也不是一朝一夕就完成的,我尽量让它漂亮一点.....每天漂亮一点点     正文 工厂方法模式是...
  • shanyongxu
  • shanyongxu
  • 2015年08月16日 20:18
  • 1701

简单工厂 工厂方法 抽象工厂 使用方法与区别

简单工厂:是由一个工厂对象决定创建出哪一种产品类的实例。 A实例调用B实例的方法,称为A依赖于B。如果使用new关键字来创建一个B实例(硬编码耦合),然后调用B实例的方法。一旦系统需要重构:需要使用...
  • lqw05
  • lqw05
  • 2016年07月14日 15:04
  • 2359

Spring 使用实例工厂方法实例化Bean

知识点介绍:         实例工厂的意思是获取对象实例的方法不是静态的,所以你需要首先new工厂类,再调用普通的实例方法。 【转载使用,请注明出处:http://blog.csdn.net/m...
  • ma_hoking
  • ma_hoking
  • 2014年12月20日 22:00
  • 2211

通过构造方法或者工厂方法创建实例的区别

构造方法: 创建一个类后,如果不声明构造方法,会默认声明一个与类的修饰符相同修饰符的无参的构造方法。 不是应该声明一个public的无参构造方法吗? 不是。 工厂方法: 就是常见的g...
  • lidachao01
  • lidachao01
  • 2016年10月31日 16:56
  • 520

工厂方法模式VS简单工厂模式

One----简单工厂模式: 一,基本知识: (1)定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。(2)理...
  • qq_28055429
  • qq_28055429
  • 2016年06月10日 23:14
  • 1566

iOS设计模式-工厂方法

工厂方法的概念以及在Objective-C中的实现方法
  • AddyChen
  • AddyChen
  • 2015年07月13日 00:39
  • 11319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工厂方法
举报原因:
原因补充:

(最多只允许输入30个字)