工厂三兄弟之简单工厂模式(一)html
工厂模式是最经常使用的一类建立型设计模式,一般咱们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于 GoF 23 种设计模式,但在软件开发中应用也较为频繁,一般将它做为学习其余工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特点,难度也逐个加大,在软件开发中它们都获得了普遍的应用,成为面向对象软件中经常使用的建立对象的工具。设计模式
图表库的设计
Sunny 软件公司欲基于 Java 语言开发一套图表库,该图表库能够为应用系统提供各类不一样外观的图表,例如柱状图、饼状图、折线图等。Sunny 软件公司图表库设计人员但愿为应用系统开发人员提供一套灵活易用的图表库,并且能够较为方便地对图表库进行扩展,以便可以在未来增长一些新类型的图表。框架
Sunny 软件公司图表库设计人员提出了一个初始设计方案,将全部图表的实现代码封装在一个 Chart 类中,其框架代码以下所示:函数
class Chart { private String type; //图表类型 public Chart(Object[][] data, String type) { this.type = type; if (type.equalsIgnoreCase("histogram")) { //初始化柱状图 } else if (type.equalsIgnoreCase("pie")) { //初始化饼状图 } else if (type.equalsIgnoreCase("line")) { //初始化折线图 } } public void display() { if (this.type.equalsIgnoreCase("histogram")) { //显示柱状图 } else if (this.type.equalsIgnoreCase("pie")) { //显示饼状图 } else if (this.type.equalsIgnoreCase("line")) { //显示折线图 } } }
客户端代码经过调用 Chart 类的构造函数来建立图表对象,根据参数 type 的不一样能够获得不一样类型的图表,而后再调用 display() 方法来显示相应的图表。工具
不难看出,Chart 类是一个“巨大的”类,在该类的设计中存在以下几个问题:性能
(1) 在 Chart 类中包含不少 if…else… 代码块,整个类的代码至关冗长,代码越长,阅读难度、维护难度和测试难度也越大;并且大量条件语句的存在还将影响系统的性能,程序在执行过程当中须要作大量的条件判断。学习
(2) Chart 类的职责太重,它负责初始化和显示全部的图表对象,将各类图表对象的初始化代码和显示代码集中在一个类中实现,违反了“单一职责原则”,不利于类的重用和维护;并且将大量的对象初始化代码都写在构造函数中将致使构造函数很是庞大,对象在建立时须要进行条件判断,下降了对象建立的效率。测试
(3) 当须要增长新类型的图表时,必须修改 Chart 类的源代码,违反了“开闭原则”。this
(4) 客户端只能经过 new 关键字来直接建立 Chart 对象,Chart 类与客户端类耦合度较高,对象的建立和使用没法分离。设计
(5) 客户端在建立 Chart 对象以前可能还须要进行大量初始化设置,例如设置柱状图的颜色、高度等,若是在 Chart 类的构造函数中没有提供一个默认设置,那就只能由客户端来完成初始设置,这些代码在每次建立 Chart 对象时都会出现,致使代码的重复。
面对一个如此巨大、职责如此重,且与客户端代码耦合度很是高的类,咱们应该怎么办?本章将要介绍的简单工厂模式将在必定程度上解决上述问题。
更多设计模式:http://wiki.jikexueyuan.com/project/design-pattern-creation/simple-two.html