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");}
}

再之后就可以从多个实现中做出选择,完成打印功能的隔离。

研磨设计模式笔记之简单工厂模式相关推荐

  1. 设计模式 笔记4 | 简单工厂模式 在源码中的应用 | Calendar 日历 | 源码浅析 | 使用总结 | 建造者模式

    文章目录 一.Calendar 日历类 1.1 内部属性 1.2 设置时间属性值 1.3 获取时间属性 1.4 使用 Calander 计算时间 二.Calender 类中的设计模式 2.1 简单工厂 ...

  2. 23种设计模式 -----Day01:简单工厂模式

    目录 前言 1.设计模式(Design pattern)定义 2.为什么要使用设计模式(使用设计模式的意义) 3.设计原则 a.单一职责原则 b.开放封闭原则 c.里氏代换原则 d.迪米特法则 e.依 ...

  3. 大话设计模式Python实现-简单工厂模式

    简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 1 #!/us ...

  4. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

  5. 设计模式----2(简单工厂模式的概念,简单工厂模式的实现,简单工厂模式的优缺点)

    简单工厂模式 简单工厂模式的概念 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负 责创建其他类的实例,被创建的实例通常都具有共同的父类. 具体分类 工厂(Creator ...

  6. 设计模式(1):简单工厂模式(Simple Factory Pattern)

    1. 从一个简单的例子开始 在众多的设计原则中,有一条原则是这么说的:要针对接口编程,不要针对实现编程. 针对接口编程的话,可以使用不同的实现类来创建这个对象.比如需要一个List: List< ...

  7. Java描述设计模式(02):简单工厂模式

    一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根据食品名称,加工指定类型食品 4).模拟客户端预定操作 2 ...

  8. 设计模式学习-简单工厂模式

    模式概述: 专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属 ...

  9. 从王者荣耀看设计模式(四.简单工厂模式)

    从王者荣耀看设计模式(简单工厂模式) 一.简介 游戏开始前,玩家可从英雄池自由挑选将要出战的英雄 二.简单工厂模式 简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫 ...

  10. 设计模式第一篇——简单工厂模式&类图

    从今天开始,小菜决定记录下来自己学习设计模式的过程,并总结每天所学内容记录在博客中. 以编写计算器程序为例,有+,-,*,/--很多种运算,因此需要if,else或switch,case进行判断,当有 ...

最新文章

  1. php in yii framework
  2. 维特森 VTD72K14 多圈空心角度传感器 角位移传感器
  3. 模态框之Uncaught Error: Syntax error, unrecognized expression:
  4. 第十九讲 拉普拉斯变换引入
  5. STL——萃取机制(Traits)
  6. 通过kubeadm安装kubernetes 1.7文档记录[docker容器方式]
  7. 前端学习(2320):typeScript的概述和安装
  8. Web服务生存周期内发生的事件/Soap扩展的阶段/Soap扩展的步骤
  9. sql server 索引阐述系列五 索引参数与碎片
  10. jquery事件绑定的几种用法
  11. 顺丰科技已上岸面经(收集牛客近年来面经)
  12. excel图表模板免费下载_40个免费的信息图表模板下载
  13. 小米pro15拆机_小米pro拆机图解(8步)
  14. 抖音去水印,快手去水印,皮皮虾去水印操作方法(2019.6.12有效)
  15. 电子工程师的自我修养 - 恒流源电路分析
  16. 【Turtle圣诞系列】今年的圣诞树都来了圣诞还会远吗?(内含多份源码)
  17. 计算机操作基础知识软件,计算机操作基础知识题库.pdf
  18. 白光模块?彩光模块?
  19. Android开发——菜单(Menu)-——上下文菜单(ContextMenu)、 弹出菜单(PopupMenu)
  20. matlab抓取网页信息,如何利用Matlab抓取网页数据

热门文章

  1. SQLyog——下载2058问题
  2. 【恶搞Python】Python实现QQ连续发送信息的代码,咋就说可还刑
  3. 二进制空间权重矩阵_Stata_ 空间权重矩阵的构建
  4. 测试方案的设计及模板
  5. Auslogics Registry Cleaner v9.2.0.0 注册表清理优化工具
  6. QT实现年会抽奖小软件的实现
  7. 数学模型——药物中毒急救模型(基于python)
  8. Unity开发——CPU优化篇
  9. WangEdit富文本编辑器图标修改
  10. html 【一个简单的用户登录页面代码】