设计模式详述 - 创建型

请特别注意:

1. 使用的是抽象类还是接口;

2. UML图中依赖、聚合和组合的关系;

3. 属性的访问控制权限;

1) 工厂方法 Factory Method

 

定义:定义一个用于创建对象的接口,让子类决定实例化哪一 个类。工厂方法使一个类的实例化延迟到其子类

 

绘图:

场景/应用:

?

 

附注:

简单工厂模式的最大优点在于工厂类 中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。违背的是幵放-封闭原则。

既然这个工厂类与分支耦合,那么我就对它下手,根据依赖倒转原则,我们把工厂类 抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类 的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体 生成对象的工厂,于是我们要增加 ***** 的功能时,就不需要更改原有的工厂类了,只 需要增加此功能的运算类和相应的工厂类就可以了。

    不足:工厂方法把简单工厂的内部逻辑判断移到了客户端代码来 进行。你想要加功能,本来是改工厂类的,而现在是修改客户端,不过利用‘反射’可以解决避免分支判断的问题。

1) 抽象工厂 Factory Method

 

定义:提供一个创建一系列相关 或相互依赖对象的接口,而无需指定它们具体的类。

绘图:

 

场景/应用:

 

?总结案例与其他书籍(《Java设计模式》?)

 

 

 

附注:

 

 

 

抽象工厂提供一个接口,它里面应该包含所有的产品创建的抽象方法。通常是在运行时刻再创建一个工厂的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。

 

 

 

在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。我们的设计不能去防止需求的更改,那么我们的理想便是 让改动变得最小,现在如果你要更改数据库访问,我们只需要更改具体工厂就可以做到。第二大好处是, 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。抽象工厂模式可以很方便 地切换两个数据库访问的代码,但是如果你的需求来自增加功能,可能需要大量类的增加。所以简单工厂的方法都不需要输入参数,用IOC的方式来进行反射处理,避免了大量类的增长。

1) 创建者 Builder

 

定义:将一个复杂对象的构建与它的表示分 离,使得同样的构建过程可以创建不同的表示。

绘图:

 

场景/应用:

 

附注:

它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部 的构建通常面临着复杂的变化。建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如 何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。所以说,建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方 式时适用的模式。

 

代码:

2) 
单例 Singleton

 

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

 

绘图:

 

场景/应用:

附注:

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以 提供一个访问该实例的方法。

实用类和单例类之间的确很类似,实用类通常也会釆用私有化的构造方法来避免其有实例。但 它们还是有很多不同的,比如实用类不保存状态,仅提供一些静态方法或静态属性让你使用,而单例类 是有状态的。实用类不能用于继承多态,而单例虽然实例唯一,却是可以有子类来继承。实用类只不过 是一些方法属性的集合,而单例却是有着唯一的对象实例。在运用中还得仔细分析再作决定用哪一种方式。

C#里的sealed class这样的实现与前面的示例类似,也是解决了单例模式试图解决的两个基本问题:全局访问和实例 化控制,公共静态厲性为访问实例提供了一个全局访问点。不同之处在于它依赖公共语言运行库来初始 化变量。由于构造方法是私有的,因此不能在类本身以外实例化类;因此,变量引用的是可以在系统中存在的唯一的实例。不过要注意,这意味着只能在静态初始化期间或在类构造函数中分配变量。由于这种静态初始化的方式是在自己被加载时就将自己实 例化,所以被形象地称之为饿汉式单例类,原先的单例模式处理方式是要在第一次被引用时,才会将自 己实例化,所以就被称为懒汉式单例类。

由于饿汉式,即静态初始化的方式,它是类一加载就实例化的对象,所以要提前占用系统资源。 然而懒汉式,又会面临着多线程访问的安全性问题,需要做双重锁定这样的处理才可以保证安全。所以 到底使用哪一种方式,取决于实际的需求。从0:#语言角度来讲,饿汉式的单例类已经足够满足我们的需 求了。

 

 

代码:

 

3) 原型Prototype

 

定义:

绘图:

场景/应用:

附注:

代码:

 

posted on 2013-10-11 12:25  heartstage  阅读(213)  评论(0编辑  收藏  举报

导航