设计模式——工厂模式(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可以根据我们的选择,来创建适合的对象 ...
随机推荐
- codeforces 598D Igor In the Museum
题目链接:http://codeforces.com/problemset/problem/598/D 题目分类:dfs 题目分析:处理的时候一次处理一片而不是一个,不然会超时 代码: #includ ...
- [Cocos2d-x学习笔记]Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawk解决方案
Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawkawk过期网上 ...
- TestComplete实测Flex
1.TestComplete提供了已经编译好的Flex界面,可以直接使用: http://support.smartbear.com/samples/testcomplete9/flex/orders ...
- EJBCA 在windows上的安装
为了做EJBCA的封装測试,在我自己电脑上装了个,可是在国内的开发上面的介绍实在是太少.有的也仅仅是些傻瓜式的安装介绍,这是介绍在Windows上安装的过程,(后面介绍下 linux 红帽上的),有些 ...
- UML中类图的符号解释
在UML的定义中,描写叙述类和对象之间的关系,包含下面几种方式:依赖(Dependency).关联(Association).聚合(Aggregation).组合(Composition).泛化(Ge ...
- 它们的定义iOS双击Home截图按键开关
<pre name="code" class="objc"><p>双击假设Home,我会去iOS App的switcher页面,这里列出 ...
- 超人学院Hadoop大数据技术资源分享
超人学院Hadoop大数据技术资源分享 http://bbs.superwu.cn/forum.php?mod=viewthread&tid=807&fromuid=645 很多其它精 ...
- dblink如果很慢可以用这种方式优化
发现dblink如果很慢可以用这种方式加个/*+driving_site(xxx)*/,查询很快 DBLINK HINT /*+ driving_site(org) */ 优化策略和思路 使用DBLI ...
- hdu3853(概率dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 题意:有一个人被困在一个 R*C(2<=R,C<=1000) 的迷宫中,起初他在 ( ...
- 自写jquery网页回到顶部效果,渐隐图标,引用js文件就可以
唔.进来开发需求,当网页内容草鸡多的时候,用户就须要有个button高速回到顶部,而不是自己去滚滑轮~ 原本以为比較难的说,由于上头要求所实用js来实现,哪个页面引用,哪个页面显示. 于是乎,本屌丝就 ...