设计模式——工厂模式(Factory)
要想正确理解设计模式,首先必须明白它是为了解决什么问题而提出来的。
设计模式学习笔记
——Shulin
转载请注明出处:http://blog.csdn.net/zhshulin
1、概念
工厂模式定义:实例化对象,用工厂方法取代new操作。达到解耦的目的(避免硬编码耦合)。工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。
工厂模式是我们最经常使用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见。由于工厂模式就相当于创建实例对象的new,我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量。
经常使用的java ee框架:Spring,Spring容器就是一个巨大的工厂。
2、目的
解耦,使程序的扩展性更强。
3、举例说明
比方如今有2个工作AWork和BWork,以后可能很多其它。假设此时我们使用简单工厂方法,那么我们会设计一个WorkFactory然后实现一个静态方法,通过參数来控制生成哪个工作。看似简单工厂也能完毕任务,可是假设以后须要加上CWork,那么须要加入CWork实现类以及改动工厂方法,假设很多其它,那么会导致工厂类过于臃肿。由于简单工厂模式仅仅有一个工厂类,它须要处理全部的创建的逻辑。
这时候就须要工厂方法模式来处理以上需求。在工厂方法模式中,核心的工厂类不再负责全部的对象的创建,而是将详细创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出详细工厂子类必须实现的接口,而不接触哪一个类应当被实例化这样的细节。
这样的进一步抽象化的结果,使这样的工厂方法模式能够用来同意系统在不改动详细工厂角色的情况下引进新的产品,这一特点无疑使得工厂方法模式具有超过简单工厂模式的优越性。以下就针对以上需求设计UML图:
从上图能够看出,这个使用的工厂方法模式的系统涉及到下面角色:
抽象工厂(IWorkFactory)角色:担任这个角色的是工厂方法模式的核心,不论什么在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常用抽象类实现。
详细工厂(AWorkFactory、BWorkFactory)角色:担任这个角色的是实现了抽象工厂接口的详细JAVA类。详细工厂角色含有与业务密切相关的逻辑,而且受到使用者的调用以创建工作类。
抽象工作(IWork)角色:工厂方法模式所创建的对象的超类,也就是全部工作类的共同父类或共有的接口。在实际的系统中,这个角色也常用抽象类实现。
详细工作(AWork和BWork)角色:这个角色实现了抽象(ExportFile)角色所声明的接口,工厂方法模式所创建的每个对象都是某个详细工作角色的实例。
4、源码
抽象工作类:
public interface IWork {
public void doWork();
}
详细工作类:
public class AWork implements IWork {
@Override
public void doWork() {
System.out.println("做的是A工作!");
}
}
public class BWork implements IWork {
@Override
public void doWork() {
System.out.println("做的是B工作!");
}
}
抽象工厂:
public interface IWorkFactory {
public IWork createWork();
}
详细工厂:
public class AWorkFactory implements IWorkFactory {
@Override
public IWork createWork() {
return new AWork();
}
}
public class BWorkFactory implements IWorkFactory {
@Override
public IWork createWork() {
return new BWork();
}
}
client角色类源码:
public class Test {
public static void main(String[] args) {
IWorkFactory aWorkFactory = new AWorkFactory();
IWork aWork = aWorkFactory.createWork();
aWork.doWork();
IWorkFactory bWorkFactory = new BWorkFactory();
IWork bWork = bWorkFactory.createWork();
bWork.doWork();
}
}
5、工厂模式和简单工厂模式
工厂方法模式和简单工厂模式在结构上的不同非常明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个详细类上。
工厂方法模式退化后能够变得非常像简单工厂模式。设想假设非常确定一个系统仅仅须要一个详细工厂类,那么最好还是把抽象工厂类合并到详细工厂类中去。因为仅仅有一个详细工厂类,所以最好还是将工厂方法改为静态方法,这时候就得到了简单工厂模式。
假设系统须要增加一个新的工作CWork,那么所须要的就是向系统中增加一个这个导类以及所相应的工厂类。没有必要改动client,也没有必要改动抽象工厂角色或者其它已有的详细工厂角色。对于增加新的导出类型而言,这个系统全然支持“开-闭原则”。
设计模式——工厂模式(Factory)的更多相关文章
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- 设计模式--工厂模式Factory(创建型)
工厂模式属于创建型模式,分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 一.简单工厂模式 在工厂中做判断,根据产品类型从而创造相应的产品,当增加新产品时需要修改工厂类. 例如: enum CTY ...
- [设计模式]工厂模式factory
参考:http://wxg6203.iteye.com/blog/740229 简单工厂模式(simple factory)是类的创建模式,又叫静态工厂方法(static factory method ...
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- 设计模式(一)工厂模式Factory(创建型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
- 设计模式(一)工厂模式Factory(创建类型)
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. ...
- 设计模式(一)工厂模式Factory(创建型)(转)
原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符 ...
- C# 设计模式-工厂模式(Factory)
1.工厂模式 factory从若干个可能类创建对象. 例如:如果创建一个通信类接口,并有多种实现方式,可以使用factory创建一个实现该接口的对象,factory可以根据我们的选择,来创建适合的对象 ...
随机推荐
- IOS中的id与nil
1 id id和void *并非完全一样.在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject) ...
- Android输入法扩展之外接键盘中文输入
大家想不想要这样一台Android Surface平板,看着就过瘾吧. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSVRsZWFrcw==/font/ ...
- 数组去重Array
var aee3=[31,42,13,19,5,11,8,13,40,39,1,8,44,15,3]; Array.prototype.unqu2=function(){ this.sort(); v ...
- 【linux驱动分析】之dm9000驱动分析(六):dm9000_init和dm9000_probe的实现
一.dm9000_init 打印出驱动的版本,注冊dm9000_driver驱动,将驱动加入到总线上.运行match,假设匹配,将会运行probe函数. 1 static int __init 2 d ...
- Virtualbox mouse move in and out and file share with windows
How to use Virstalbox to share files with Linux and Windows, and to move the mouse in and out Virtua ...
- servlet其工作原理和例子证明
servlet简单介绍 当我们在地址栏里面输入www.baidu.com,终于呈如今我们面前的是百度搜索的页面.在这些訪问过程中,都会有一个webserver来处理这些请求以及訪问处理后的结果. 而s ...
- svn rm --keep-local ./QueryParser_kill.logs
svn rm --keep-local ./QueryParser_kill.logs
- Knockout获取数组元素索引的2种方法,在MVC中实现
原文:Knockout获取数组元素索引的2种方法,在MVC中实现 在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespa ...
- sharpSVN说明文档
http://sharpsvn.open.collab.net/docs/walkthrough.htm
- 存储管理(一):openfiler介绍及存储理解
openfiler是一个免费的.开源的基于浏览器的网络存储产品,支持基于文件的的网络连接存储(NAS)和基于块的存储区域网(SAN).支持的协议有smb,cifs,nfs,http/dev和ftp. ...