java设计模式之抽象工厂模式
上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包-开放原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
工厂方法模式的概念
工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品(百度百科)
工厂方法模式的UML图
我特意去阅读了《大话设计模式》《设计模式之禅》,把类图在补充一下:当抽象工厂只有一个产品,变为工厂方法模式,当产品多个时候变为抽象工厂模式
这里在放2张简单工厂和工厂方法模式的图,形成对比:
工厂方法模式的代码
我们接着简单工厂模式的例子继续讲解工厂方法模式,如果在简单工厂模式中需要增加一种不男不女的人,就需要修改工厂类中的生成方法了,虽然可以实现我们需要的结果,但是违背了java的开放-闭包的原则。我们根据前面的例子做一改造。
/**
* This is factory patter package
*/
package com.roc.factory; /**
* 产品的抽象接口 人类
* @author liaowp
*
*/
public interface Human { public void say(); }
/**
* This is factory patter package
*/
package com.roc.factory; /**
* man 男人
* @author liaowp
*
*/
public class Man implements Human { /* say method
* @see com.roc.factory.Human#say()
*/
@Override
public void say() {
System.out.println("男人");
} }
/**
* This is factory patter package
*/
package com.roc.factory; /**女人
* @author liaowp
*
*/
public class Woman implements Human { /* say method
* @see com.roc.factory.Human#say()
*/
@Override
public void say() {
System.out.println("女人");
} }
前面的代码是一样的,现在我们需要为一种人创建一个工厂类,既然每一个人都有自己的工厂类,那是不是可以抽一个类呢,对的,我们就抽出一个工厂接口来。
package com.roc.factory;
/**
* 工厂接口类
* @author liaowp
*
*/
public interface Factory { public Human crateMan(); }
创造男人的工厂类
package com.roc.factory;
/**
* 创造男人工厂类
* @author liaowp
*
*/
public class ManFactory implements Factory{ public Human crateMan() {
return new Man();
} }
创造女人的工厂类
package com.roc.factory;
/**
* 创造女人工厂类
* @author liaowp
*
*/
public class WomanFactory implements Factory{ @Override
public Human crateMan() {
// TODO Auto-generated method stub
return new Woman();
} }
客户端类
package com.roc.factory;
/**
* 抽象工厂测试
* @author liaowp
*
*/
public class Client {
public static void main(String[] args) {
Factory factory=new ManFactory();
Human man2=factory.crateMan();
man2.say(); }
}
改造完成,经过我这么一改造,你现在知道怎么增加创造不男不女的人吗?这样一改造你需要增加任何的类型都只需要增加一个工厂类,一个产品类。然后在客户端写出新的调用。完全符合了java的开发与闭包原则。
应用场景
java设计模式之抽象工厂模式的更多相关文章
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- java设计模式(三)--抽象工厂模式
转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...
- Java 设计模式之抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- [java] java 设计模式(2):抽象工厂模式(Abstract Factory)
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- Java设计模式(3)——抽象工厂模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象. 一.产品族和产品等级结构 为 ...
- java设计模式之抽象工厂模式学习
工厂模式有个问题就是,类的创建依赖工厂.要想增加一个工厂类,就要修改原来的代码,这违背了闭包原则.所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
随机推荐
- 如何停止CSS3的动画?
前言 我们在移动端一般使用zepto框架,与其说zepto是jquery的轻量级替代版,不如说是html5替代版我们在js中会用到animate方法执行动画,这个家伙可是真资格的动画,完全是css一点 ...
- PyCharm使用(完全图解(最新经典))
PyCharm使用 一.PyCharm设置(版本:PyCharm 2016.1.2) 1.python环境设置 1.1.pycharm新建程序自动补全编码和环境: pycharm设置在 ...
- 服务 {49A27252-A326-4EF1-B698-6EBC7068833C} 的计时器作业 id {573BE459-DF82-481C-84BD-CA14D287450B} 配置刷新的上一个实例仍在运行,因此将跳过当前的实例。请考虑增加作业之间的时间间隔。
在SharePoint2007的错误日志中发现大量如下错误: 07/02/2013 16:17:25.99 OWSTIMER.EXE (0x0958) 0x097C Window ...
- CoreDataManager-Swift版-兼容iOS10以前的版本
import UIKit import CoreData // coredata管理器 class CoreDataManager: NSObject { // 单例 static let share ...
- <转>关于Certificate、Provisioning Profile、App ID的介绍及其之间的关系
转自:http://www.cnblogs.com/cywin888/p/3263027.html 刚接触iOS开发的人难免会对苹果的各种证书.配置文件等不甚了解,可能你按照网上的教程一步一步的成功申 ...
- sqlite3 not found问题解决方法
测试发现,有些Android手机自带sqlite3命令,有些不带.对于不带sqlite3的手机,我们可以手动将sqlite3加入系统. 执行如下命令 adb remount adb push 路径/s ...
- mac ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib /mysql/mysql.sock' (111)
之前装了mysql,今天打开mysql的时候报了个Can't connect to local MySQL server through socket '/var/lib /mysql/mysql.s ...
- HTTP协议基本知识
Xcode7.0以上版本必须操作:https http 在Info.plist中添加NSAppTransportSecurity类型Dictionary. 在NSAppTransportSecurit ...
- 我的android学习经历9
给android的activity添加背景图片 1.你可以在网上下载android的图片,也可以制作自己的图片,图片的后缀为.png,也就是png格式的图片(注意图片的大小要适合你的手机屏幕或者AVD ...
- Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)
完整的开发一个android移动App需要经过从分解需求.架构设计到开发调试.测试.上线发布等多个阶段,在发布后还会有产品功能上的迭代演进,此外还会面对性能.安全.无线网络质量等多方面的问题. 移动A ...