二.设计模式中的创建型模式
前言:
因为仅仅只是总结其中的优点和缺点,本文章仅仅只是提及他们之间的优缺点和功能,并不提供代码分析,个人在这里推荐一本书:大话设计模式;本书是由C#为基础写的,但是面向对象的语言其实差距并不大,相信各位有一点计算机基础的都应该可以理解.
创建型模式是处理对象创建的设计模式
1.抽象工厂模式
功能:
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:
最大的好处是方便交换产品系列,由于具体工厂类(使用接口来抽离具体工厂的类,然后在创建工厂的时候可以使用接口来接收具体工厂),在一个应用中我们仅仅只需要在初始化的时候出现一次,这样可以改变具体工厂非常容易了.在需要的时候我们仅仅只需要修改具体工厂时,使用不同的产品配置就可以完成.
缺点:
当我们需求中需要增加功能的时候,我们需要修改多个类才可以完成.
PS:虽然我感觉抽象工厂模式将开放封闭原则和依赖倒转原则发挥到了极致,但是它的不足之处还是非常致命的,在开发的设计中我们应该拿着辩证的思考去考虑选择的每一个设计模式.
2.建造者模式
功能:
将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示
优点:
使建造代码与表示代码分离,由于建设者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了.总之就是在我们使用建设者模式的时候客户端调用并不需要考虑其中有什么,只需要调用它来创建需要的对象即可.因为其的封装性,我们使用它的时候需要内部结构非常稳定,但是构建时候面临的各种复杂问题.
缺点:
因为使用建造者模式的时候,需要内部结构非常稳定,所以它创建出来的产品都相差不大,如果我们创建的产品差距较大的时候,请不要使用建造者模式.
3.工厂方法模式
功能:
定义一个用于创建对象的接口,让子类决定实列化哪一个类.工厂方法使一个类的实列化延迟到其子类
优点:
向客户隐藏了哪种具体产品将被实例化的细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,无须知道具体产品类的类名。他创建对象时仅仅只需要指定实列化的是那个类即可,所有的细节都封装在了工厂方法中
缺点:
在添加新产品的时候,其中我们需要修改的类将会呈现几何数增长,从一定层度上讲增大了我们程序设计的复杂度,这样是不可取的.
4.原型模式
功能:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
优点:
由一个对象创建另外一个可定制的对象,而且不需知道任何创建的细节.简单点来说可以相当于一次拷贝,因为每次new出对象的初始化工作太过于低效,所以在我们初始化信息不需要改变的时候,使用原型进行克隆是最好的办法,既隐藏了对象创建的细节,创建对象的效率也得到了提高.
缺点:
需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则.
5.单例模式
功能:
保证一个类仅有一个实例,并提供一个访问它的全局访问点
优点:
由于只有一个对象,再其他频繁需要使用该对象的时候可以减少创建销毁对象时消耗的性能,提高程序的性能.
缺点:
其实违反了单一职责原则,单例它的职责过重.并且单例模式没有抽象类和接口,所以他在扩展功能的能力上几乎不可能.
6.简单工厂模式
功能:
由一个工厂对象决定创建出哪一种产品类的实例
优点:
明确了各自之间的职责和权力,有利于软件体系结构的优化.
缺点:
添加功能就要修改工厂类,非常的麻烦.
PS:我其实不想写简单工厂模式的,毕竟它的缺点在工厂方法模式中都得到了优化,简单工厂模式感觉仅仅只是提出了工厂创建对象的这个概念,在我们软件设计的时候大部分可以直接过滤掉简单工厂模式.