黑马程序员_设计模式SimpleFactory_11

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

简单工厂设计模式
一、概念
简单工厂设计模式是设计模式中最简单的创建型设计模式,用在程序中创建对象的方面。创建对象是比较消耗内存的,所以为了这个目的,就出现了创建型模式。按照名字就知道这个设计模式就是通过一个简单的工厂来完成对象的创建,客户端只要简单的调用工厂里面创建对象的方法来创建你想要的对象。

二、使用时机
简单工厂模式使用在创建的对象比较少且不是很复杂的情况下,如果是这样,那么请大胆的使用这种模式,但要记住如果你想要继承工厂扩展有扩展的思想,那么简单工厂是不合适的,因为其里面的方法是静态的,static是不可以继承下来的。

三,Demo

UML图 1.1
算法类class Operation,有两个int类型的成员变量numA和numB,还有一个GetResult()方法

加减乘除的类分别继承算法类class Operation并且实现GetResult()方法
 
简单工厂类OperationFactory,可以根据具体需求创建出合适的对象
黑马程序员_设计模式SimpleFactory_11_第1张图片
客户端(主函数main()调用)用简单工厂去实例化具体的对象

四,小结一下
 * 把主函数main()看做客户端的话通过工厂设计模式让客户端和业务逻辑相分离通过向简单工厂传参数,
 * 工厂就可以实例化出合适的对象,通过多态返回父类的方式实现计算结果。
 * 这样无论是Windows控制台程序,还是Web程序,还是手机程序都可以用
 * 这段代码了,如果小修改加法功能只需要该OperationAdd()即可,如果
 * 要增加复杂的运算,只需要extends Operation 实现其getResult()方法
 * 让后再工厂里加一条记录即可,就跟main()没有关系了。
 * 但是遇到要频繁修改工厂的问题的时候,这就是比较糟糕的处理方式了;

----------------------------------------------------------------------------------------------------------------------------------------------------------
五,换一个角度从下往上看UML图 1.1
        一开始在客户端(主函数)里直接写加法类,当需要算减,除法和更多功能的时候,事情就来了!!!那么就需要在客户端里new 许多的类的实例,这样客户端就会很庞大,int numA和 numB也会随着类增加翻倍增长,占去了大量的存储空间,影响性能不说,这样还会使得客户不得不认识更多的类,不方便具体的操作!!!那么根据加减乘除法类的共性向上抽取出一个抽象类:Opertaion运算类。在其中定义好numA和numB,因为就是求两个数的‘和差积商’所以抽取方法getResult()。然后让不同功能的类去继承并实现getResult()方法即可。这样的好处:
1)变量实例化减少了,只有一组numA和numB
2)客户端只需要实例化一个OpertationFactory类即可根据需要选择要实例化的类的对象,减轻客户端的担。
3)不选择的变换封装到了OperationFactory类中,以后的修改就与main()客户端没了关系。
4)易扩展,(比如求平方,开根号等)只要添加相应的类extends Operation 并实现getResult()方法即可。
5)易修改,把具体的实现和客户端分离,每个独立功能的类都有自己独立的getResult()方法处理具体问题。
6)较好的符合开放封闭的原则。

六,开放封闭的原则
 *由于需求在不断的变化,怎样的设计才能面对需求的改变而保持系统的相对稳定,从而使得系统可以在第一   个版本后不断推出新的版本。
 *最好(多扩展,少修改)就是在你设计的时候,做到尽量让某个类足够好不用修改新的需求来了只需要增加新的类就完事了,原来的类就不需要修改。
 *然而绝对的封闭式不存在的:无论模块封闭的再好,都会存在一些无法对之封闭的变化

 *设计人员必须对于所设计的模块应该对应那种变化做出选择。必须先猜猜测出可能发生的变化的种类,然后抽象出来隔离这些变化!
 *开闭原则的精髓就是:在面对变化的时候,对程序的改动都是通过增加代码来进行的而不是改动现用的代码!
 *开闭原则是面向对象的核心所在:遵循这个原则可以带来面向对象所申明的可维护,可扩展,可复用,灵活性好的好处。
 *开发人员应该对程序中出现频繁变化的那部分作出抽象,然而,对应用程序刻意的进行抽象也不可以,拒绝不成熟的抽象和抽象本身一样的重要!

七,缺点
         如果需要创建大量的对象,那么工厂会越来越大,不利于以后的维护和修改,且工厂的方法是静态的不可以继承,基本没有扩展了条件,所以修改基本不可能。


----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima



你可能感兴趣的:(黑马程序员_设计模式SimpleFactory_11)