设计模式 —— 简单工厂模式、工厂模式
简单工厂模式的定义
简单工厂模式是由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例,被创建的实例通常都具有共同的父类。这种类型的模式不在23种设计模式之中。
使用场景:
- 工厂类负责创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象(逻辑)不关心。简单工厂模式很容易违反高内聚低耦合的原则,因此一般只在很简单的情况下使用。
工厂模式的定义
定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。这种类型的模式属于创建型模式。
优点:
- 一个调用者想创建一个对象,只要知道其名称就可以了。
- 扩展性高,如果想增加一个产品,只要增加一个具体类和对象实现工厂就可以。
- 屏蔽产品的具体实现,调用者只关心产品的接口。
- 使用者并不需要知道具体的创建过程,减少了使用者因为创建逻辑导致的错误,减少了重复代码,也方便以后对产品的创建过程的修改维护
缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
使用场景:
- 工厂类负责创建的对象比较少,但只有一个产品族(如示例中的 PolicyProducer)
注意事项: 作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
场景引入
假如要设计一个汽车保险管理程序。汽车保险分为很多险种,例如人身伤亡(Body Injur)、碰撞(Collision)、驾驶员本身伤亡(Person Injur)、财产损失(Property)、综合险(Com)等。假设我们现在要创建一个对象,要如何创建比较合理呢?下面我们以创建 BodyInjur 类的对象为例。
方案一:直接创建
即不对创建对象的过程进行任何封装,直接new一个。但是,这种设计有以下几种不足
- 可扩展性和可维护性差。如果产品类创建过程的其它代码改变了,则需要重新编译整个ClientGUI类,不符合开闭原则
- main()集中了复杂对象创建过程的其它代码,程序可读性差
步骤一:定义产品类接口 Autolnsurancel
public interface Autolnsurancel{abstract String getlnsurlnfo(); // 抽象方法
}
步骤二:创建产品子类(以 Bodylnjur 为例)
public class Bodylnjur implements Autolnsurance{private String description;public String getlnsurlnfo(){System.out.println(description)}
}
步骤三:创建客户端
public class ClientGUI{public static void main(String[] args) {Bodylnjur创建过程的其它代码Autolnsurance a = new Bodylnjur (); // 创建产品子类a.getlnsurlnfo(); // 调用产品方法
}
方案二:简单工厂模式
将类的选择和对象的创建封装在一个工厂方法(getInsurObj) 中,而将这个方法封装在一个独立的工厂类(PolicyProduce)里面。这种模式改善了可维护性和可扩展性,但如果要添加或者改变一些选择条件或产品类的创建过程,仍需要重新编译整个工厂类(PolicyProducer ),不符合开闭原则。
步骤一:定义产品类接口 Autolnsurancel
public interface Autolnsurancel{abstract String getlnsurlnfo();
}
步骤二:创建产品子类(以 Bodylnjur 为例)
public class Bodylnjur implements Autolnsurance{private String description;public String getlnsurlnfo(){System.out.println(description)}
}
步骤三:创建工厂类
public class PolicyProducer{public static Autolnsurance getPolicyObj(String option){Autolnsurance policy=null; if(option. compareTo("bodylnjure")==0){bodylnjur创建过程的其它代码policy=new Bodylnjur();}else if(option. compareTo("collision")==0){collision创建过程的其它代码poliy=new Collision();}else if(option. compareTo("com")==0){com创建过程的其它代码policy=new Comprehensive();}else if(option. compareTo("personlnjure")==0){personlnjure创建过程的其它代码policy=new Personlnjur();}return policy;}
}
步骤四:创建客户端
public class ClientGUI{public static void main(String[] args) {Stirng option="bodylnjure";Autolnsurance a = PolicyProducer.getPolicyObj(option); // 调用产品子类a.getlnsurlnfo(); // 调用产品方法}
}
方案三:工厂模式
将单一的工厂类 (PolicyProdecer) 改写为一个层次类,对每一个具体类创建一个工厂。若增加新产品,这种模式不需要修改客户类 (如 ClientGUI),无需修改或者重新编译抽象的工厂方法类与已经存在的具体工厂方法类,符合了开闭原则;若修改产品类的创建过程,只需要修改对应的工厂子类即可。
步骤一:定义产品类接口 Autolnsurancel
public interface Autolnsurancel{abstract public String getlnsurlnfo();
}
步骤二:创建产品子类(以 Bodylnjur 为例)
public class Bodylnjur implements Autolnsurance{private String description;public String getlnsurlnfo(){System.out.println(description)}
}
步骤三:定义工厂类接口 PolicyProducer
public interface PolicyProducer{abstract public String getlnsurObj();
}
步骤四:创建工厂子类(以 Bodylnjur 为例)
public class BodyPolicy implements PolicyProducer{public Autolnsurance getlnsurObj(){bodylnjur创建过程的其它代码return new Bodylnjur();}
}
步骤五:创建客户端
public class ClientGUI{public static void main(String[] args) {PolicyProducer pp = new BodyPolicy(); // 创建工厂子类Autolnsurance a=pp.getlnsurObj(); // 创建产品子类a.getlnsurlnfo(); // 调用产品方法}
}
设计模式 —— 简单工厂模式、工厂模式相关推荐
- 设计模式简单代码之Command模式(皇帝圣旨篇)
作者:一雨田( http://blog.csdn.net/dylgsy/ ).本文欢迎转贴,并请保留此信息 在现实的情况中,有一个实例能非常贴切的描述了Command模式,这就是皇帝和士兵的关系.皇帝 ...
- JavaScript设计模式--简单工厂模式例子---XHR工厂
JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
- 设计模式--简单工厂模式
什么是工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对 ...
- C++设计模式--简单工厂模式
概述 工厂模式:封装对象的实现.它可能是所有设计模式中最有用的模式之一了.这里要说的是简单工厂模式,又称为静态方法工厂模式,属于创建性模式.其原理就是通过传入的参数来判断应该创建什么对象. UML 类 ...
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军.吕震宇 老师的文章更是堪称经典.他们的文笔如行云流水,例子活泼生动,讲解深入浅出.好在他们都是用C ...
- 解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么
本文首发于博客园,地址:http://www.cnblogs.com/beniao/archive/2008/08/09/1263318.html 一.模式概述 从设计模式的类型上来说,简单工厂模式是 ...
- getresourceasstream方法_【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】...
文章系列目录(持续更新中): [设计模式]第一篇:概述.耦合.UML.七大原则,详细分析总结(基于Java) [设计模式]第二篇:单例模式的几种实现And反射对其的破坏 一 为什么要用工厂模式 之前讲 ...
- 设计模式 — 简单工厂模式
一点点 工厂模式是我们最为常用的设计模式之一,目的是用于隐藏创建对象的细节. 工厂模式的核心是: 工厂类(Factory).工厂类作为中间人的角色帮我们创建对象.通俗点说:我们要获取对象时,不是通过自 ...
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
最新文章
- Kali Linux 2020.1乱码问题
- SQLServer: 无法修改表
- CCF201403-2 窗口
- postgreSQL源码分析——索引的建立与使用——GIST索引(3)
- div+css布局与seo的关系
- Dijkstra 路径规划 C#
- 在动态库内部获取动态库路径
- mac怎么修改hosts文件
- app安全评估报告,如何搞定呢?!
- Java必知必会的问题
- 摄影师用AI预测MJ、李小龙活到现在长什么样,网友看后泪目
- python阿里巴巴排名_全自动监控网页关键词排名(Python实现)
- mysql获取去年同期_mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据...
- 如何高效学习python
- SpringBoot操作ES进行各种高级查询(值得收藏)
- 一个VB VB.NET源码的博客网站,不错
- visio 2007:方向键无法移动图像解决方法
- java递归怎么写_Java 基本的递归写法
- Kies Air连接电脑传文件挺好用的 不用连数据线
- ncnn Mat矩阵类
热门文章
- 后台管理系统[01第三方库集成]
- 屏幕小于6英寸的手机_来!推荐几款6英寸以内“小屏手机”给你
- ShanaEncoder 官网链接
- erp视频教程 php_erp为何不用php开发
- 【状语从句练习题】because / because of / although / in spite of
- 百度地图点聚合功能如何提高性能
- DirectX9.0C Aug.2007
- LVOOP(一)、如何创建类、属性和方法
- 不对齐 谷歌浏览器_CHROME谷歌浏览器中文两端对齐
- java 线程机制_Java线程机制学习