设计模式学习笔记——创建模式

转载 2007年09月27日 13:04:00

1.简单工厂模式(静态工厂方法) Simple Factory:
 作用:将生产者和消费者分离,适用于对象创建时需要进行比较复杂处理的情况,即消费者符合开闭原则;
 详解:一个工厂生产所有产品,工厂得到要生产产品的订单号,然后生产出相应的产品(即在工厂类中有一个静态的生产方法,根据参数判断、创建并返回相应的对象,静态方法的返回值为产生对象的基类;消费者直接调用这个工厂类的生产方法即可得到想要的对象);
 缺陷:每增加一种产品类型,需要在生产方法里增加相应的判断逻辑和业务逻辑等,不符合开闭原则(对扩展开放,对修改关闭);
    所生产的产品可能有多层次树状结构,由单一工厂来生产负担过重。

2.工厂方法模式 Factory Method:
 作用:分担单一工厂生产的压力,使工厂类也符合开闭原则;
 详解:每个工厂只生产一种产品,由产品委员会指导各个工厂生产(即定义一个产品委员会接口,包含一个返回值为产品基类的非静态的生产方法,每个生产工厂类实现这个接口,各自实现具体的生产方法,用于生产继承了产品基类的不同对象;消费者需要调用指定的生产工厂类的生产方法得到想要的对象);
 缺陷:产品种类很多时,需要大量与之对应的工厂类;
    需要在客户程序中将具体工厂角色写死,往往只适合产生单个的实例;
    产品对象创建条件的改变必然会引起工厂角色的修改。

3.抽象工厂模式 Abstract Factory
 作用:给客户程序提供统一抽象类,可以创建多个不同类型的产品对象;
 详解:每个工厂都要生产多种不同种类的产品,此时标准委员会为每种类型的产品制订统一标准,各个工厂根据标准生产出各具特色的各个种类的产品(即定义一个标准委员会抽象基类,包含多个返回值为某种类型产品基类的抽象生产方法,每个生产工厂类继承标准委员会抽象基类,实现标准委员会定义的各个类型产品的生产方法,用于生产继承了某种类型产品基类的对象;消费者需要选择一个工厂类,然后可以得到该工厂类能生产出的所有类型的对象);
 缺陷:增加新的产品类型时,需要增加标准委员会基类中抽象方法,同时需要在工厂类中增加该方法实现。

4.原型模式 Prototype
 作用:增删产品类型时,可以通过统一管理器来维护,使扩展更加容易;
 详解:有一个产品档案管理处,当你要增加一个产品类型时,你必须先在产品档案管理处注册这个产品,之后要生产此种产品时,也必须先通过产品档案管理处查找到此产品方能生产(克隆)出此产品,当然,你也可以通过产品档案管理处注销此产品,使之不能再生产(即定义一个原型管理器类,此类拥有一个容器用于存放已经注册过的产品信息,同时此原型管理器类有至少三个方法:注册新产品、注销产品和生产指定产品,生产指定产品的方法用调用了克隆clone方法来从原有对象中抽取信息放到新的产品对象中);
 缺陷:每个产品类型的原型必须必须包含clone方法,在已有类的基础上来添加clone操作是比较困难的;
    当内部包含一些不支持copy或者循环引用的对象时,实现更加困难。

5.建造模式 builder
 作用:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
 详解:现在制造委员会和组装委员会各司其职,制造委员会负责指定制订制造和显示的标准,组装委员会负责组装过程的标准化,具体的制造者根据制造委员会的标准完成各个部件的制造,然后在组装委员会的指导下统一装配,最后完成想要的产品(即定义制造委员会接口,定义部件生产方法和产品的表示方法,具体每个制造者类实现此制造委员会接口,组装委员会类对制造委员会接口编程,并包含统一的装配方法;消费者将制造者类的实例传给组装委员会类,组装委员会类调用统一装配方法,之后由制造者类的表示方法得到想要的复杂产品对象);
 类比:建造模式着重于逐步将组件装配成一个成品并向外提供成品,而抽象工厂模式着重于得到产品族中相关的多个产品对象。

6.单例模式 Singleton
 作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点;
 详解:单例模式可以分为有状态和无状态的,有状态的单例对象一般也是可变的单例对象,多个单例对象在一起就可以作为一个状态仓库一样向外提供服务,没有状态的单例对象也就是不变的单例对象,仅用做提供工具函数;
    普通的单例模式通常采用私有构造函数,或者构造静态实例(饿汉),或者采用静态工厂方法(懒汉),此种做法的使得该类不能被继承,从而失去多态性;亦有“高级”做法,采用受保护构造函数,而采用静态的注册对象容器存储已经生成对象实例,用静态工厂方法来限制对已经存在同样类名的实例则不再创建新的实例,仅返回原有实例,此种做法允许该类被继承;
 陷阱:在使用EJB、JINI、RMI技术的分布式系统中,由于中间件屏蔽掉了分布式系统在物理上的差异,想知道哪个虚拟机下运行了哪个单例对象是很困难的应该避免使用存在状态的单例模式;
    不同类加载器会使用不同命名空间来区分同一个类,单例类在多加载器的环境中会产生多个单例对象,在一般情况下不要使用存在状态的单例模式;
    采用静态工厂方法的单例模式中,如果同步处理不恰当,可能达不到得到单个对象的效果,还会引发死锁等错误;
    采用受保护的构造函数时,由于类的构造函数不再私有,可能会失去对对象的控制,只能通过良好的文档来规范;
    为使一个单例类可串行化,不仅要在声明中添加"implements Serializable",还要在单例类中添加readResolve方法(因为一个串行化的对象每次返串行化的时候,都会创建一个新的对象,而不仅仅是一个对原有对象的引用)。
 

Java多线程设计模式详解学习笔记三——SingleThreadExecution

public class Main { public static void main(String[] args) { Gate gate=new Gate(); new UserThr...

设计模式学习笔记——依赖倒置原则

依赖倒置最精简的定义就是“面向接口编程”,这个思想我以前一直没有理解,写了很久的程序了,几乎很少写接口,也从不想去写接口,不知道接口到底有什么用,其实,还是写的少啊,而且写的东西都是小型的东西,看来还...

《从零开始学Swift》学习笔记(Day 66)——Cocoa Touch设计模式及应用之通知机制

通知(Notification)机制是基于观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是 MVC( 模型-视图-控制器)模式的重要组成部分。 问题提出...

《从零开始学Swift》学习笔记(Day 64)——Cocoa Touch设计模式及应用之目标与动作

原创文章,欢迎转载。转载请注明:关东升的博客  目标(Target)与动作(Action)是iOS和OS X应用开发的中事件处理机制。 问题提出如图所示是一个ButtonLabelSample案例设计...

《Java编程思想_ 深入理解java虚拟机_Thinking in java__Effiect java__设计模式》学习笔记7——泛型编程基础

转载地址:http://blog.csdn.net/chjttony/article/details/6785221 还有相关的文章:http://blog.csdn.net/waldmer/a...

黑马程序员 学习笔记——Java 二十三设计模式之单例

----------------------android培训 、java培训、期待与您交流! ---------------------- Java 中解决某一问题最行之有效的方法是设计模式。...

Java Web学习笔记2——JavaBean 与 设计模式一(Model 1)

JaveBean与 Model 1   一、Model1 如果由JSP接受用户请求,并对用户请求做出处理、相应。这样,html界面脚本中有很多数据访问、逻辑的代码,不容易维护,比较混乱。类似于在An...
  • sjyhehe
  • sjyhehe
  • 2015年03月09日 18:17
  • 677

设计模式学习笔记——类图

学习设计模式,少不了类图。要能看懂类图。类图中比较容易混淆,分辨不清的是类与类之间的关系。关系如下:1、关联1)双向关联2)单向关联3)自关联4)多重性关联5)聚合6)组合2、依赖3、泛化4、接口...

JS学习笔记——面向对象,设计模式

面向对象,设计模式相关概念: JS中,只有函数具有作用域。定义在一个函数中的变量,在该函数内嵌的函数是可以访问的。 函数是运行在定义他们的作用域中,而不是运行在调用他们的作用域中。...

boolan——c++学习笔记之设计模式二

对象创建模式 一、工厂方法(Factory Method) 二、抽象工厂(Abstract Factory)...
  • starzpc
  • starzpc
  • 2017年04月13日 21:52
  • 138
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式学习笔记——创建模式
举报原因:
原因补充:

(最多只允许输入30个字)