Java设计模式(二)

本文详细介绍了创建型模式下的简单工厂、工厂方法、抽象工厂、原型和单例模式,阐述了各自的优缺点以及适用场景,强调了开闭原则在模式设计中的应用。
摘要由CSDN通过智能技术生成

创建型模式

一、简单工厂模式

定义一个工厂类,可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同父类。

类创建型模式;又称为静态工厂方法;只需要传入一个正确的参数就可以获取所需要的对象,无须知道创建细节。

模式结构:

包含的角色:工厂角色、抽象产品角色、具体产品角色。

优点

1)实现了对象创建和使用的分离

2)客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可

3)通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

缺点

1)工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响

2)增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度

3)系统扩展困难,一旦添加新产品不得不修改工厂逻辑 由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构,工厂类不能得到很好地扩展

适用环境

1)工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂

2)客户端只知道传入工厂类的参数,对于如何创建对象并不关心扩展

3)产品等级结构相对比较稳定,不需要经常增加或者删除具体产品类

二、工厂方法模式

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

类创建型模式;虚拟构造器模式、多态工厂模式、工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象;

模式结构:

包含以下4个角色: Product(抽象产品) ConcreteProduct(具体产品) Factory(抽象工厂) ConcreteFactory(具体工厂)

优点

1)工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节

2)能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部

3)在系统中加入新产品时,完全符合开闭原则

缺点

1)系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销

2)增加了系统的抽象性和理解难度

适用环境

1)客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)

2)抽象工厂类通过其子类来指定创建哪个对象

三、抽象工厂模式

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

产品等级结构:产品等级结构即产品的继承结构

产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品

对象创建型模式;抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品 当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率;

模式结构:

包含以下4个角色: AbstractFactory(抽象工厂) ConcreteFactory(具体工厂) AbstractProduct(抽象产品) ConcreteProduct(具体产品)

  开闭原则的倾斜性

 增加产品族

对于增加新的产品族,抽象工厂模式很好地支持了开闭原则,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改  

增加新的产品等级结构

对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了开闭原则

优点

1)隔离了具体类的生成,使得客户端并不需要知道什么被创建

2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象

3)增加新的产品族很方便,无须修改已有系统,符合开闭原则

缺点

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则

适用环境

1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节

2)系统中有多于一个的产品族,但每次只使用其中某一产品族

3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来

4)产品等级结构稳定,在设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构

四、原型模式

使用原型实例指定待创建的对象类型,并且通过复制这个原型来创建新的对象。

对象创建型模式;

将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程 ;

创建新对象(也称为克隆对象)的工厂就是原型类自身,工厂方法由负责复制原型对象的克隆方法来实现; 通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立的;

模式结构:

包含以下3个角色: Prototype(抽象原型类) ConcretePrototype(具体原型类) Client(客户类)

 浅克隆与深克隆

 浅克隆(Shallow Clone):当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制

深克隆(Deep Clone):除了对象本身被复制外,对象所包含的所有成员变量也将被复制

优点

1)简化对象的创建过程,通过复制一个已有实例可以提高新实例的创建效率 ;扩展性较好

2)提供了简单的创建结构,原型模式中产品的复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品

3)可以使用深克隆的方式保存对象的状态,以便在需要的时候使用,可辅助实现撤销操作

缺点

1)需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了开闭原则

2)在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来可能会比较麻烦

适用环境

1)创建新对象成本较大,新对象可以通过复制已有对象来获得,如果是相似对象,则可以对其成员变量稍作修改

2)系统要保存对象的状态,而对象的状态变化很小

3)需要避免使用分层次的工厂类来创建分层次的对象

五、单例模式

确保一个类只有一个实例,并通提供一个全局访问点来访问这一唯一实例。

实现要点

1)私有构造函数

2)静态私有成员变量(自身类型)

3)静态公有的工厂方法

模式结构:

只包含一个单例角色: Singleton(单例)

饿汉式单例类:无须考虑多个线程同时访问的问题;调用速度和反应时间优于懒汉式单例;资源利用效率不及懒汉式单例;系统加载时间可能会比较长

懒汉式单例类:实现了延迟加载;必须处理好多个线程同时访问的问题;需通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响

优点

1) 提供了对唯一实例的受控访问

2) 可以节约系统资源,提高系统的性能

3) 允许可变数目的实例(多例类)

缺点

1) 扩展困难(缺少抽象层)

2) 单例类的职责过重

3) 可能会导致共享的单例对象的状态丢失

适用环境

1)系统只需要一个实例对象,或者因为资源消耗太大而只允许创建一个对象

2)客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例

  • 59
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值