设计模式——工厂模式(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可以根据我们的选择,来创建适合的对象 ...
随机推荐
- java基础---->摘要算法的介绍 (转)
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(Hash)算法. ...
- A股市场暴跌背后的三大元凶?
周一两市低开低走,盘中空方连续打压股指,大盘一路下行,沪指2000点关口告急,收于1963.24点,跌幅超过了5%.行业板块全线溃败.银行.证券领衔大幅杀跌,板块跌幅一度超过5%:继上周五中国石油A股 ...
- Tutorial: 结合使用AngularJS和Django
好吧,我承认自己很懒,时间又不够用. 翻译的几个文章都是虎头蛇尾,但我保证这次肯定不太监. 关键的单词不翻译,实在觉得翻译成汉语很别扭,括号里是参考翻译. 有问题和建议尽管提出来,我会改进完善. Tu ...
- uva10480(最小割)
传送门:Sabotage 题意:给定多个城市的网络,每个城市之间的通信有花费,要求使得首都和最大城市之间的通信断掉的最小花费.要求输出任意一组砸掉的边. 分析:跑一遍最大流dinic后,根据最小割定理 ...
- HDU 3277 Marriage Match III(二分+最大流)
HDU 3277 Marriage Match III 题目链接 题意:n个女孩n个男孩,每一个女孩能够和一些男孩配对,此外还能够和k个随意的男孩配对.然后有些女孩是朋友,满足这个朋友圈里面的人.假设 ...
- UVA 11100 The Trip, 2007 贪心(输出比较奇葩)
题意:给出n个包的大小,规定一个大包能装一个小包,问最少能装成几个包. 只要排序,然后取连续出现次数最多的数的那个次数.输出注意需要等距输出. 代码: /* * Author: illuz <i ...
- HDU 4815 背包
标题的含义给出N问题.和概率P,然后给予相应的分数为每个问题x(每个问题只有两种选择,纠正错误). 两个人来回答.一个人是随机选择的答案,问:还有一个人的至少一些点的能力有保证P概率不会失败. 01背 ...
- ubuntu linux 13.04更新
首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 而后用gedit或其他编辑器打开: gksu gedit /et ...
- Eclipse扩展点实践之添加菜单项(ActionSet方式实现)
ActionSet方式比起Command方式,比较直观,但是功能有限. 首先:新建一个项目,在Extension中添加org.eclipse.ui.actionSets的扩展. 然后,new-> ...
- POJ 2942 Knights of the Round Table - from lanshui_Yang
Description Being a knight is a very attractive career: searching for the Holy Grail, saving damsels ...