研磨设计模式笔记之简单工厂模式
1.不用模式的解决方案
1.1 示例
(1)首先定义接口Api,示例代码如下:
public interface Api {public void test1(String s);
}
(2)有了Api,自然要有实现,此处功能为输出字符串,示例如下:
public class ImplA implements Api{@Overridepublic void test1(String s) {System.out.println("Now In Impl. The input s == " + s);}
}
(3)客户端调用实现
public class Client {public static void main(String[] args){Api api = new ImplA();api.test1("哈哈,不要紧张,只是一个测试而已!");}
}
1.2 分析问题
可以看到上例中,客户端已经知道了相应的实现,所以根本没有做到“封装隔离”。
要做到“封装隔离”,客户端就不应该知道具体的实现是什么,那么“new Impl()”就应该封装起来,让客户端看不到。
2.带模式的解决方案
2.1 简单工厂重写示例
(1)Api与相应实现Impl都与上面相同
此处主要说一下简单工厂Factory,示例如下:
public class Factory {//返回的实例包裹在Factory中,这样客户端就看不到了public static Api create(){return new ImplA();}
}
(2)重写客户端代码,代码如下:
public class Client {public static void main(String[] args){//这个时候就不用显式写出new Impl(),而是通过工厂来返回Api api = Factory.create();api.test1("正在测试重写简单工厂。。。");}
}
从客户端来看,不需要知道具体的实现是什么,也不需要知道如何实现的,只知道从工厂获得了一个接口对象,然后通过接口来获取想要的功能。
2.2 带选择的简单工厂
上面重写示例中,只有一种实现,要是有多种实现又该如何呢?
(1)Api和相应实现不变
在上面的基础上再添加一种实现ImplB,代码如下:
public class ImplB implements Api {@Overridepublic void operation(String s) {System.out.println("ImplB s == "+ s);}
}
(2)修改简单工厂Factory,做到选择实现,代码如下:
public class Factory {public static Api create(int condition){Api api = null;if(condition == 1){api = new ImplA();}else if(condition == 2){api = new ImplB();}return api;}
}
(3)修改客户端代码:
public class Client {public static void main(String[] args){//客户端通过1或者2,来选择相应的实现Api api = Factory.create(1);api.operation("正在使用简单工厂");}
}
2.3 带选择的简单工厂的缺陷
带选择的简单工厂有很大的局限性,如果有多重选择,那么就要在工厂中多次判断,复杂性大大提升。另外从客户端调用工厂的时候传入选择的参数,增加了硬编码。
这种复杂性不能放在代码中来判断,而应该放在外部,从代码中独立出来,放在配置中。
2.4 可配置的简单工厂
(1)配置文件用properties文件,定义一个“FactoryTest.properties”文件放在工厂类的同一个包下,内容如下:
ImplClass=com.zte.rewriteonproperties.ImplA
(2)修改工厂类Factory,代码如下:
public class Factory {public static Api createApi(){Properties p = new Properties();InputStream in = null;//读取配置文件in = Factory.class.getResourceAsStream("FactoryTest.properties");try {p.load(in);} catch (IOException e) {System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:");e.printStackTrace();}finally {try {//读取完毕,要记住关流in.close();} catch (IOException e) {e.printStackTrace();}}Api api = null;try {try {//反射创建实例api =(Api)Class.forName(p.getProperty("ImplClass")).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}} catch (ClassNotFoundException e) {e.printStackTrace();}return api;}
}
(3)客户端代码示例如下:
public class Client {public static void main(String[] args){//可以看到,此时就不需要传入参数,复杂性直接转移到配置文件中控制Api api = Factory.createApi();api.test1("哈哈哈,不要紧张,测试而已!");}
}
3.思考简单工厂
本人还处于学习阶段,在使用简单工厂方面还缺少经验。
根据我的理解,在同一个功能有多重实现的时候,就可以选用简单工厂,一方面能够做到接口隔离,另一方面能够做到选择实现,集中管理和控制。
举个例子,同样的打印功能,可以用爱普生的,或者惠普的。这些打印厂家都实现了打印标准,同一接口。
(1)首先有个同一的接口Print
public interface Print{public void print(String s);
}
(2)然后再有多个实现EpsonImpl,HpImpl
public class EpsonImpl implements Print{public void print(String s){System.out.println("this is EpsonPrinter");}
}
public class HpImpl implements Print{public void print(String s){System.out.println("this is EpsonPrinter");}
}
再之后就可以从多个实现中做出选择,完成打印功能的隔离。
研磨设计模式笔记之简单工厂模式相关推荐
- 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式
文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...
- 23种设计模式 -----Day01:简单工厂模式
目录 前言 1.设计模式(Design pattern)定义 2.为什么要使用设计模式(使用设计模式的意义) 3.设计原则 a.单一职责原则 b.开放封闭原则 c.里氏代换原则 d.迪米特法则 e.依 ...
- 大话设计模式Python实现-简单工厂模式
简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 1 #!/us ...
- 手撕设计模式之「简单工厂模式」(Java描述)
前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...
- 设计模式----2(简单工厂模式的概念,简单工厂模式的实现,简单工厂模式的优缺点)
简单工厂模式 简单工厂模式的概念 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负 责创建其他类的实例,被创建的实例通常都具有共同的父类. 具体分类 工厂(Creator ...
- 设计模式(1):简单工厂模式(Simple Factory Pattern)
1. 从一个简单的例子开始 在众多的设计原则中,有一条原则是这么说的:要针对接口编程,不要针对实现编程. 针对接口编程的话,可以使用不同的实现类来创建这个对象.比如需要一个List: List< ...
- Java描述设计模式(02):简单工厂模式
一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根据食品名称,加工指定类型食品 4).模拟客户端预定操作 2 ...
- 设计模式学习-简单工厂模式
模式概述: 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属 ...
- 从王者荣耀看设计模式(四.简单工厂模式)
从王者荣耀看设计模式(简单工厂模式) 一.简介 游戏开始前,玩家可从英雄池自由挑选将要出战的英雄 二.简单工厂模式 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫 ...
- 设计模式第一篇——简单工厂模式&类图
从今天开始,小菜决定记录下来自己学习设计模式的过程,并总结每天所学内容记录在博客中. 以编写计算器程序为例,有+,-,*,/--很多种运算,因此需要if,else或switch,case进行判断,当有 ...
最新文章
- php in yii framework
- 维特森 VTD72K14 多圈空心角度传感器 角位移传感器
- 模态框之Uncaught Error: Syntax error, unrecognized expression:
- 第十九讲 拉普拉斯变换引入
- STL——萃取机制(Traits)
- 通过kubeadm安装kubernetes 1.7文档记录[docker容器方式]
- 前端学习(2320):typeScript的概述和安装
- Web服务生存周期内发生的事件/Soap扩展的阶段/Soap扩展的步骤
- sql server 索引阐述系列五 索引参数与碎片
- jquery事件绑定的几种用法
- 顺丰科技已上岸面经(收集牛客近年来面经)
- excel图表模板免费下载_40个免费的信息图表模板下载
- 小米pro15拆机_小米pro拆机图解(8步)
- 抖音去水印,快手去水印,皮皮虾去水印操作方法(2019.6.12有效)
- 电子工程师的自我修养 - 恒流源电路分析
- 【Turtle圣诞系列】今年的圣诞树都来了圣诞还会远吗?(内含多份源码)
- 计算机操作基础知识软件,计算机操作基础知识题库.pdf
- 白光模块?彩光模块?
- Android开发——菜单(Menu)-——上下文菜单(ContextMenu)、 弹出菜单(PopupMenu)
- matlab抓取网页信息,如何利用Matlab抓取网页数据