23种设计模式 - 创建型

23种设计模式研究过好几遍了,网上的解析和例子也是超多,我就不在耗费大量空间列demo例子了。为了**再研究下这个,顺便记录下体会以备日后查询。

注:类图引字互联网,但可能出处不唯一,所以不会全部列出出处。

 

简单一句话概括各设计模式用途:

Factory:省掉new,利用多态集中创建对象。

AbstractFactory:用于创建分组的对象,举例,游戏中打怪设级别,初级则所有创建的对象都是初级。

Singlon:单例模式,创建唯一对象

builder:分步骤的创建对象,根据每步创建对象的参数不同导致最后得到的对象不同。

Prototype: clone,自己拷贝自己。注意深拷贝和浅拷贝。

=========================简单工厂===================================================================

1 简单工厂模式

 

解决的问题:

1)避免在程序中大量的使用new 描述符,因为new时需要记住目标类的名称(类多时很难);另外在后期维护如果想改具体类的名字会很简单(集中在工厂类中)。

2) 有时候父类在使用时不知道具体要new那个子类,这时候需要用到第二种模型。举例,父类A定义时需要使用某个具体类的一个方法,但是不知道应该new的具 体类名字,但A的子类B知道应该new什么对象。 所以A中直接使用B来get 具体类。B就是ConcreteFactory.

原理:

简单工厂一般有两种主要实现方式,

方式一较常见,核心是Factory类成员函数createProduct(type)中的type参数,根据type类型来new不同的concreteProduct类。即声明了创建对象的接口,封装了创建对象的过程。

方式二与方法一的区别是增加了一层抽象,即不但封装了对象的创建,而且将具体类的创建过程放到子类实现,父类知识提供了创建的接口。

不足:

1)方法一增加新的ConcreteProduct将更改CreateProduct()实现,导致不封闭。方法二每新建一个子类都需要在Factory中派生concreteProduct类,类爆炸啊。。。

====================抽象工厂=============================================================================

2. 抽象工厂

 

解决的问题:

1)在日常编程中通常需要根据情况的不同产生同类的一组对象,举例来说,一个游戏可 以设置高中低三个难度级别进行打怪兽(怪兽有很对种),所以当设置成不同级别的时候,所new出的对象就应该是响应级别的怪兽。抽象工厂可以完美解决这个 问题。该模式的目的是创建一组相关或者相互依赖的对象。

2)维护起来也相对容易很多,因为只需派生新的具体工厂类,或添加新的具体产品类就可完成新同组对象的添加。

原理:

抽象工厂的实现部分借鉴了简单工厂,抽象工厂类提供了产生一组对象的接口,而每一个具体工厂完成都完成一组相关对象的创建。比如,ConcreteFactory1创建的是1类型(A1和B1)对象。ConcreteFactory2创建的是2类型(A2和B2)类型。

====================单例模式=============================================================================

解决的问题:

系统中很对对象具有全局唯一性的特点,比如系统中的打印机,系统中的某些工厂对象。

原理:

实现上有懒汉模式(需要时创建对象)和饿汉模式(初始化时new对象)两种方式,核心都是创建一个静态的私有变量和一个静态共有获取方法,同时将构造函数私有化。。

其他:

在使用上单例模式可以和其他模式结合使用,如与工厂模式一起使用创建唯一的工厂对象。另外需要注意单例模式在多线程方面的使用问题,其中懒汉模式不是多线程安全的(需要check instance ==null),饿汉模式是线程安全的。

====================builder模式=============================================================================

解决的问题:

1. 生产某中同类型产品,这些产品拥有类似的生产过程顺序(方法),但每个生产过程略有不同时采用builder模式

2. 相同方法不同的执行顺序,生产出不同的产品

关键点:有一系列相同的方法,当这些方法的执行顺序或者方法的具体实现有细微差别时可采用builder模式 

原理:

Product类:具体的产品类,负责产品自身逻辑。builder不关注product内部方法和逻辑

Builer类:两种实现方式,一般都具备两个接口。方式1:提供构建产品的顺序结构e.g. buildA(), buildB()的方法1。提供getProduct()返回具体产品的方法2。 这种方式更具build*(para)中调用具体参数不同来构建product。该种方式适合解决生产顺序固定的问题。方式2:SetSequerence()设置构建产品顺序的虚方法1和getProduct()返回Product的虚方法2. 此时相同的方法有Product类提供,不同concreteProduct实现这些方法,且构建顺序由setSequence()方法提供。具体可参见转载的博文:http://www.cnblogs.com/stephen-init/p/3915809.html

ConcreteBuilder:实现builder接口

Director类:包含一个私有的builder接口数据成员,和一个construct()方法,该方法调用builder->build*()来完成构建和返回Product对象。

其他:

注意和抽象工厂的区别,他们解决的是不同问题。

 

====================Prototype模式=============================================================================

解决的问题:

有时需要根据当前对象创建相同的对象,提供了比直接调用拷贝构造函数更高一层的抽象。

关键点:复制对象自己,注意深拷贝

原理:

模式简单,注意深拷贝浅拷贝区别。

其他:

n/a

posted on 2014-08-27 10:38  Stephen_init  阅读(209)  评论(0编辑  收藏  举报