前言
每几种模式之间都有一定的联系,从中发现它们的相同点和不同点,研究发生改变的节点,这就是本篇博客所要说明的创建型设计模式之间的联系。它们包括:简单工厂模式、单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。
创建型模式的基本理解
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。
一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。
一、它们都将关于该系统使用哪些具体的类的信息封装起来。
二、它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道方法的是由抽象类所定义的接口
六种模式的简单认识
一、定义和适用性
★简单工厂模式(Simple Factory)
简单工厂模式又名静态工厂方法模式,是所有工厂模式中最简单的一个;
它定义一个具体的工厂类来负责创建所有类的对象并初始化创建的对象;
它主要由3部分组成:工厂类、抽象类、实现抽象类的具体类,然后通过客户端调用工厂类创建相应的对象。
注意:简单工厂模式不属于GoF总结的23种设计模式,它是相当于初学Java的HelloWorld案例,帮助初学者了解设计模式,增长信心的一个设计模式。
★抽象工厂模式(Abstract Factory)
1.提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。
2.适用于:
一个系统要独立于它的产品的创建、组合和表示时;
一个系统要由多个产品系列中的一个来配置时;
当要强调一系列相关的产品对象的设计以便进行联合使用时;
当提供一个产品类库,而只想显示它们的接口而不是实现时。
★建造者模式(Abstract Factory)
1.将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
2.适用于:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;
当构造过程必须允许被构造的对象有不同的表示时。
★工厂方法模式(Factory Method)
1.一个用于创建对象的接口,让子类决定实例化哪一个类,它使一个类的实例化延迟到其子类。
2.适用于:
当一个类不知道它所必须创建的对象的类的时候;
当一个类希望由它的子类来指定它所创建的对象的时候;
当类将创建对象的职责委托给多个子类中的某一个,并且你希望将哪一个子类是代理者这一信息局部化的时候。
★原型模式(ProtoType)
1.用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2.适用于:
当一个系统应该独立于它的产品创建、构成和表示时;
当要实例化的类是在运行时刻指定时,例如,通过动态装载;
为了避免创建一个与产品类层次平行的工厂类层次时;
当一个类的实例只能有几个不同状态组合中的一种时。
★单例模式(Singleton)
1.保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.适用于:
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;
当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
二、UML图的理解
★抽象工厂模式(Abstract Factory)
1.参与者
抽象工厂AbstractFactory:声明一个创建抽象产品对象的操作接口。
具体工厂ConcreteFactory:实现创建具体产品对象的操作。
抽象产品AbstractProduct:为一类产品对象声明一个接口
具体产品Product:定义一个将被相应的具体工厂创建的产品对象实现AbstractProduct接口。
客户端Client:仅使用由AbstractFactory和AbstractProduct类声明的接口
2.协作
通常在运行时刻创建一个ConcreteFactroy类的实例。
这一具体的工厂创建具有特定实现的产品对象。
为创建不同的产品对象,客户应使用不同的具体工厂。
AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类
3.效果
1)将客户与类的实现分离。产品的类名也在具体工厂的实现中被分离。
2)一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。
3)它有利于产品的一致性。当一个系列中的产品对象被设计成一起工作时,应用一次只能使用同一个系列中的对象。
4)AbstractFactory接口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口。
★建造者模式(Abstract Factory)
1.参与者
•Builder(抽象建造者)
—为创建一个Product对象的各个部件指定抽象接口。
—有多少组成部件就有多少个接口
•ConcreteBuilder(具体建造者角色)
—实现Builder的接口以构造和装配该产品的各个部件。
—给出一步一步完成创建产品实例的操作。
—在建造过程完成后提供产品实例
•Director(导演者)
—构造一个使用Builder接口的对象。调用具体建造者角色以创建产品对象。
导演者本身没有产品类的具体知识。
•Product(产品)
—表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程。 —包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
2.协作
• 客户创建Director对象,并用它所想要的Builder对象进行配置。
• 一旦产品部件被生成,导向器就会通知生成器。
• 生成器处理导向器的请求,并将部件添加到该产品中。
• 客户从生成器中检索产品。
★工厂方法模式(Factory Method)
参与者
抽象产品AbstractProduct:定义工厂方法所创建的对象的接口。
具体产品Product:实现Product接口
抽象工厂AbstractCreator
1)声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
2)可以调用工厂方法以创建一个Product对象。
具体工厂Creator:重定义工厂方法以返回一个Product实例。
★原型模式(ProtoType)
• 参与者
Prototype—声明一个克隆自身的接口
ConcretePrototype—实现一个克隆自身的操作
Client—让一个原型克隆自身从而创建一个新的对象。
• 协作
客户请求一个原型克隆自身。
• 效果
Prototype对客户隐藏了具体的产品类,因此减少了客户知道的名字的数目。
★单例模式(Singleton)
参与者:
1)一个getInstance操作,允许客户访问它的唯一实例。
2)可能负责创建它自己的唯一实例。
协作:
客户只能通过Singleton的getInstance操作访问一个Singleton的实例。
效果-优点:
1)对唯一实例的受控访问
2)缩小名空间,避免了那些存储唯一实例的全局变量污染名空间。
3)允许对操作和表示的精化。Singleton类可以有子类,而且用这个扩展类的实例来配置一个应用是很容易的。你可以用你所需要的类的实例在运行时刻配置应用。
4)允许可变数目的实例
5)比类操作更灵活
关系总结
1、工厂方法模式与简单工厂模式
(1)工厂方法模式是简单工厂模式的扩展,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
(2)如果只有一个具体工厂类,工厂方法模式可以改造为简单工厂模式。
2.抽象工厂与工厂方法
(1)抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态
抽象工厂经常用工厂方法来实现。
(2)抽象工厂模式是对象的创建模式,是工厂方法模式的进一步推广
工厂方法模式针对的是一个产品等级结构;抽象工厂模式需要面对多个产品等级结构。
3.建造者模式和抽象工厂模式
共同点:可以创建复杂的对象。
不同点:
(1)着重点
建造者模式着重于一步步构造一个复杂的对象,强调的是产品的内部组成;
抽象工厂模式着重于多个系列的产品对象。
(2)返回值
建造者模式在最后一步返回产品,而抽象工厂模式立即返回产品。
(3)角度
建造者模式处于宏观角度,抽象工厂模式处于具体的角度。
联系:
一个系统可以有一个建造者模式和一个抽象工厂模式组成,客户端通过调用这个建造者模式,见解钓友另一个抽象工厂模式的工厂角色。工厂模式返还不同产品族的零件,而建造者模式把他们组装起来。
4.原型与抽象工厂
(1)原型模式(Prototype),不需要创建Creator的子类,但他们通常需要一个针对Product类的Initialize操作。
(2)两者往往是竞争关系,但是可以一起使用
抽象工厂可以存储一个被克隆的原型的集合,并返回产品的对象。
5.单例模式与其他创建型模式
单例模式与其他创建型模式并不矛盾,可以用单例模式来实现其他模式中的对象。
包括抽象工厂模式、建造者模式和原型模式等。
小结
通过对比联系,可以发现这几种创建型模式之间是相互发展,相互借鉴的,结合具体的情况,运用于不同的场合,在实际的项目开发中,运用起来就非常地不错了。