创建型模式
为什么我们需要创建型模式?
因为创建型模式隐藏了这些类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样,创建型模式在创建了什么、谁创建它、它是怎么被创建的,以及何时创建这些方面提供了很大的灵活性。
创建型模式抽象了实例化的过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。创建型模式都会将关于该系统使用哪些具体的类的信息封装起来。允许客户用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的,即在编译时指定,也可以是动态的,就是运行时再指定。
当一个系统应该独立于它的产品创建、构成和表示时,应该考虑用创建型模式。
松耦合
如果理解松耦合,首先要谈谈内聚性与耦合性,内聚性描述的是一个例程内部组成部分之间相互联系的紧密度。而耦合性描述的是一个例程与其他例程之间联系的紧密程度。软件开发的目标应该是创建这样的例程:内部完整,也就是高内聚,而与其他例程之间的联系则是小巧、直接、可见、灵活的,这就是松耦合。
(一)抽象工厂模式
抽象工厂提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。
(二)建造者模式
建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
(三)工厂方法模式
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂模式使一个类的实例化延迟到其子类。与其它几种创建型模式相比,其它的创建型模式都可能设计出比工厂方法更加灵活的代码,但是它们的实现也相对就更加复杂。通常设计应该从工厂方法开始,当设计者发现需要更大的灵活性时,设计便会向其他创建型模式演化。当设计者在设计标准之间进行权衡的时候,了解多个创建型模式可以给设计者更多的选择余地。工厂方法能使我们增加新的产品时,不需要去更改原有的产品体系和工厂类,只需扩展新的类就可以了。这对于一个模式是否优秀是非常重要的判断标准。充分体现了开发封闭原则。
只要是在做面向对象的开发,创建对象的工作不可避免。创建对象时,负责创建的实体通常需要了解要创建的是哪个具体的对象,以及何时创建这个而非那个对象的规则。而我们如果希望遵循开放-封闭原则、依赖倒转原则和里氏代换原则,那使用对象时,就不应该知道所用的是哪一个特选的对象。此时就需要“对象管理者”工厂来负责此事。在创建对象时,使用抽象工厂、原型、建造者的设计比使用工厂方法要更灵活,但它们也更加复杂,通常,设计是以使用工厂方法开始,当设计者发现需要更大的灵活性时,设计便会向其它创建型模式演化。工厂方法的实现并不能减少工作量,但是它能够在必须处理新情况时,避免使已经很复杂的代码更加复杂。
(四)原型模式
原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。建立相应数目的原型并克隆它们通常比每次用合适的状态手工实例化该类更方便一些。
(五)单例模式
单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,一个实例是很重要的。单例模式的优势就是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且还提供了一个访问该实例的方法。这样就使得对唯一的实例可以严格地控制客户端怎样以及何时访问它。