创建型设计模式

一、创建型模式

 

在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。

基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。

 

创建型模式由两个主导思想构成

一是将系统使用的具体类封装起来二是隐藏这些具体类的实例创建和结合的方式。

 

创建型模式又分为对象创建型模式和类创建型模式。

对象创建型模式处理对象的创建,类创建型模式处理类的创建。详细地说,对象创建型模式把对象创建的一部分推迟到另一个对象中,而类创建型模式将它对象的创建推迟到子类中。

 

创建型模式旨在将系统与它的对象创建、结合、表示的方式分离。这些设计模式在对象创建的类型、主体、方式、时间等方面提高了系统的灵活性。

 

创建型模式增强了对象和类之间的独立性

 

在以下情况中,可以考虑应用创建型模式:

一个系统需要和它的对象和产品的创建相互独立。

一组相关的对象被设计为一起使用。

隐藏一个类库的具体实现,仅暴露它们的接口。

创建独立复杂对象的不同表示。

一个类希望它的子类实现它所创建的对象。

类的实例化在运行时才指定。

一个类只能有一个实例,而且这个实例能在任何时候访问到。

实例应该能在不修改的情况下具有可扩展性。

 

二、列举五大创建型设计模式

 

工厂方法模式和抽象工厂模式具体见《比较工厂三姐妹》。

 

1、工厂方法模式(Factory Method)(略)

2、抽象工厂模式(Abstract Factory)(略)

 

3、建造者模式(Builder)

 

建造者模式:将一个产品的内部表象与产品的生成过程分割开了,可以使一个建造过程生成具有不同的内部表象的产品对象。简而言之,将一个复杂对象的创建与它的表示分离,使同样的创建过程可以创建不同的表示。

 

结构图:

举例:建造小人(《大话设计模式》中的例子)

 

优缺点:采用建造者模式可以轻松地改变产品的内部表示。建造者模式将构造代码和表示代码分开。建造过程可以更精细地控制,生成器模式强调的是产品的构造过程,产品各部分具有依赖关系非常重要。需要注意的是,不同建造器产生的对象可能不属于同一类型,因此使用生成器的客户必须知道产品的具体类型。这意味着建造器经常不能互换,不同的建造器针对的客户程序也不相同。

注:与抽象工厂模式的比较:建造者模式关注于将构造对象的过程和构造的各个部分分开,而抽象工厂关注于构建一个产品系列。实际上,最大的区别是生成器模式创建的产品不一定有共同的父类,只要有类似的构造过程即可。实际上我们常见到的文件资源管理器的实现完全可以使用建造者模式。

建造者模式和工厂模式很相象,但是它们有很明显的区别。那就是工厂模式只是根据给的参数不同,工厂"生产"并返回不同的对象。建造者模式除了根据不同参数"生产"不同对象外,这些不同的对象还包含着不同的数据。建造者模式比工厂模式复杂就复杂在多"数据"这一部分。

4、单例模式(Singleton)

 

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

 

结构图:

举例:有些类也需要计划生育。(《大话设计模式》中的例子)

 

优点:对唯一实例的受控访问。

缩小名空间。

 

注:单例提供了全局惟一的访问入口,因此易于控制可能发生的冲突。

与全局变量的比较:单例模式维护自身的实例化,在使用时是安全的。一个全局对象无法自行维护,也就无法避免重复创建多个实例,系统资源会被大量占用。更糟糕的是在很多情况下会出现逻辑问题,当这些对象访问相同的资源(例如串口时)时,会发生访问冲突。

 

5、原型模式(Prototype)

 

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。子类实现克隆。

 

结构图:

举例:复印简历(《大话设计模式》中的例子)

优点引入Prototype模式后不再需要一个与具体产品等级结构平行的工厂方法类,减少了类的构造,同时客户程序可以在运行时刻建立和删除原型(自定义界面时,此点尤其重要)

此处引入的知识点式浅拷贝与深拷贝的问题:

 

浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用。

深拷贝(Deep Copy 深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。

 

差别就是在对于引用类型的实现深拷贝和浅拷贝的时候的机制不同,前者是MemberwiseClone 方法实现,后者是通过继承实现ICloneable接口中提供的Clone方法,实现对象的深拷贝。

 

注:原型模式同工厂模式,同样对客户隐藏了对象的创建工作,但是,与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的,达到了"隔离类对象的使用者和具体类型(易变类)之间的耦合关系"的目的。

 

本文链接:http://blog.csdn.net/caozhangyingfei0109/article/details/8608240

本文作者:廊坊师范学院信息技术提高班九期张薄

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值