简单工厂模式(上)
作为一个新手,开始听到设计模式的时候是蒙蔽的,什么?编程居然还能被归类成方法?还只被归纳成了23种?这么少就可以解决那么多问题么?
于是我开始接触了设计模式·····
从开始的单例模式到工厂模式,单例模式还是很简单,还挺好理解,但到工厂模式就感觉有了一些难度,等到了抽象工厂模式,感觉懵逼+1,不过还好我们之前有很多巨人,我看到一篇文章,讲了一种叫做简单工厂模式的东西,感觉对工厂模式理解加深了一些,我会以我理解的方式阐述一下简单工厂模式,原文链接我会附在文章末尾。
首先,如果你想开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,例如柱状图、饼状图、折线图等。图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库,而且可以较为方便地对图表库进行扩展,以便能够在将来增加一些新类型的图表。(如果你不知道工厂模式,很懵逼) 设计人员提出了一个这样一个初始设计方案
image
客户端代码通过调用Chart类的构造函数来创建图表对象,根据参数type的不同可以得到不同类型的图表,然后再调用display()方法来显示相应的图表。
不难看出,Chart类是一个“巨大的”类,在该类的设计中存在如下几个问题:
(1)代码if else过多,代码过长,相应不适合阅读,维护,测试。而且条件语句影响代码性能
(2)当需要增加新类型的图表时,必须修改Chart类的源代码,违反了“开闭原则”。
(3)客户端只能通过new关键字来直接创建Chart对象,Chart类与客户端类耦合度较高,对象的创建和使用无法分离。
当然 还有一些问题,但是我没太理解,我也就没写,这篇文章我也是写给刚入门的新手(老手请直接翻到文章末尾看那个我看了很久的原文)
而简单工厂模式怎么解决这些问题的呢?
他目的就是:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节
image** Factory(工厂角色):**工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。
Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。
在简单工厂模式中,客户端可以通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象
在使用简单工厂模式时,首先需要对产品类进行重构,一般我们不能设计一个包罗万象的产品类,所以我们需根据实际情况设计一个产品层次结构,将所有产品类公共的代码移至抽象产品类,并在抽象产品类中声明一些抽象方法,以供不同的具体产品类来实现,典型的抽象产品类代码如下所示
image在具体产品类中实现了抽象产品类中声明的抽象业务方法,不同的具体产品类可以提供不同的实现,典型的具体产品类代码如下所示
image接下来这一步就是工厂模式完成这项功能的核心部分:
简单工厂模式的核心是工厂类,在没有工厂类之前,客户端一般会使用new关键字来直接创建产品对象,而在引入工厂类之后,客户端可以通过工厂类来创建产品,在简单工厂模式中,工厂类提供了一个静态工厂方法供客户端使用,根据所传入的参数不同可以创建不同的产品对象,典型的工厂类代码如下所示:
image在客户端代码中,我们通过调用工厂类的工厂方法即可得到产品对象,典型代码如下所示:
image而接下来就是用简单工厂模式解决这个问题的重构后的结构了
image在图2中,Chart接口充当抽象产品类,其子类HistogramChart、PieChart和LineChart充当具体产品类,ChartFactory充当工厂类。完整代码如下所示:
image image编写如下客户端测试代码:
image创建柱状图!
初始化设置柱状图!
显示柱状图!
在客户端测试类中,我们使用工厂类的静态工厂方法创建产品对象,如果需要更换产品,只需修改静态工厂方法中的参数即可,例如将柱状图改为饼状图,只需将代码:
chart = ChartFactory.getChart("histogram");
改为:
chart = ChartFactory.getChart("pie");
编译并运行程序,输出结果如下:
创建饼状图!
初始化设置饼状图!
显示饼状图!
成功了!!!
当然这个设计还是有一些不足,既然我们知道有不足 我当然会接把它解决
不过方法是在下篇文章讲给大家·······
这是原文链接简单工厂模式
我会持续的把我对设计模式的翻译与理解写给大家,希望大家喜欢。。。新手上路请多关照