软件设计与体系结构知识总结——第十一章 Design Patterns 1

目录

0.前言

1.Introduction

Creative design pattern

2.Factory pattern(满足开闭原则)

2.2 Creative Patterns Idea

2.3 Factory method

2.4 The Simple Factory Pattern

2.5 Factory Pattern

2.6 Abstract Factory Pattern

3. Singleton pattern

Structural design pattern

1.Composite Pattren组合模式

2.Adapter design pattern适配器设计模式(满足开闭原则)


0.前言

        本系列文章旨在软件设计与体系结构的知识点,资料来源四川大学授课内容,可用于期末复习,笔者理解尚浅,文中不正之处静待批正。加粗部分为重点。

第十一章整体框架

1.Introduction

设计模式Design patterns是软件设计的经验总结,是解决软件设计中反复出现的设计问题的成功方案;其核心思想是软件重用;设计模式主要用于软件的局部设计

架构模式Architecture pattern是一种高层次的设计;它适用于整体软件设计而设计模式适用于局部软件设计

设计模式的4个基本元素:Name(context)/Problem/Solution/Effect

开闭原则The open and close principle:开闭原则禁止修改模块中已有的代码,但模块的行为可以扩展;许多设计模式都是为满足开闭原则而设计的

面向对象的设计模式可分为三类: 创造性设计模式,如工厂模式factory pattern;结构性设计模式,如复合模式composite patterns;行为性设计模式,如迭代器模式iterator patterns

Creative design pattern

2.Factory pattern(满足开闭原则)

创造性设计模式creative design pattern是解决对象创建机制的设计模式

目的:提高对象创建的灵活性;方法:将创建和使用分离(简单创建/提高构造效率/可修改性/性能)

2.2 Creative Patterns Idea

Idea:封装特定类的知识,隐藏创建的细节

2.3 Factory method

为了简化 main() 函数,创建代码从主函数中抽象出来,然后将其放入一个专门用于创建对象的函数中,该函数称为工厂函数 CreateObj()

优点:工厂方法隐藏了创建对象的细节,简化了客户端程序;工厂方法实现了创建和使用分离的理念

2.4 The Simple Factory Pattern

工厂方法没有从客户类中彻底提取创建工作。客户类也必须知道创建对象的细节;简单工厂模式建立了另一个独立的类,负责创建对象

客户只需简单地使用由创建者类构建的产品类;在模式中实现了责任分离;可以添加新的产品子类,但不会对客户产生影响;

缺点:当添加新产品时,静态工厂方法将被修改,不满足开闭原则,静态工厂方法不能被继承,它是一个单独的类

2.5 Factory Pattern

工厂模式改进了简单工厂模式:将单个创建者类变为分层创建者类;不同的创建者创建不同的产品

工厂方法是动态的;满足开闭原则;工厂模式的工厂方法不包括创建产品的逻辑判断(多态Polymorph)

2.6 Abstract Factory Pattern

一个具体的创建者类有一个工厂方法并构建一个产品;一组创建者类以工厂模式构建一组产品

例子:设计一个房屋销售查询系统。现在考虑两种类型的房屋:别墅house和公寓condo。假设这两种类型的房屋包括两个等级:超级和中等。

①客户端类 ClientGUI 调用静态方法 BuildingFactory:getBuildingFactory(type:String)

②getBuildingFactory(type:String) 方法创建一个合适的工厂子类:MediumBuildingFactory 或 SuperBuildingFactory,然后将其父类 BuldingFactory 返回给客户端。

③客户类使用返回的工厂子类对象,并通过调用工厂子类的 getHouse() 或 getCondo() 方法来获取具体产品类

④客户通过调用具体产品类的 getHouseInfo() 或 getCondoInfo() 来获取房屋信息

如果需要添加 ProductA3 和 ProductB3,工厂类层次结构需要添加 ConcreteCreator3 类

如果要添加一个新的产品层次类 ProductC。您必须为每个创建者类添加工厂类 C。在这种情况下,抽象工厂模式不符合开放和关闭原则

3. Singleton pattern

在软件设计中,有时需要一个类只产生一个对象。单例模式是为了确保一个类只有一个唯一的实例,并提供一个全局访问点。

实现机制:实现单例模式的机制是将类的构造方法声明为私有类型。为了创建私有类型对象,需要使用静态方法 getInstance() 只返回一个对象实例。

优点:单例模式严格控制客户程序访问其唯一的实例;模式中的单例类可以轻松更改,允许类创建一定数量的对象

架构设计模式Structural design pattern

架构设计模式的主要目的是将不同的类和对象组合在一起,形成更大或更复杂的结构;它主要关注类与类之间的连接方式(compose object)

1.Composite Pattren组合模式

计算机由许多独立组件组成,包括显示器、主机、键盘和鼠标等。从功能角度来看,计算机的整体和部分是有区别的。在某些情况下,他们并不区分,例如价格。

组合模式是一种将整体和部分同等看待的设计模式,也就是说,复合对象和简单对象的接口是统一处理的。组合对象是由一个或多个类似对象组成的对象,每个对象都有类似的功能。组合对象的理念是,客户端以相同的方式处理单个对象和一组对象

组件Component:实现共享接口所有类的默认行为

叶子Leaf:单个组件

组合Composite:表示一组组件

客户端Client:通过组件接口操作组合对象。叶片和组合对象的实际过程不同

优点:定义了由叶子对象和复合对象组成的类层次结构;复合模式以一致的方式处理叶子对象和复合对象,从而简化了客户端过程;添加新类型组件变得更容易

例子:五子棋

复合模式设计有两种类型:安全模式Security pattern和透明模式transparent pattern。

安全模式:组合类中存在 add() 和 remove() 等方法。但是,叶子对象中不存在这些方法

缺点:组合对象和叶子对象的接口不同

透明组合模式中,所有组件类(包括叶子和复合对象)都声明了 add()、remove() 和 getChild() 接口

优点:所有组件都有相同的接口;缺点:存在一些风险

2.Adapter design pattern适配器设计模式(满足开闭原则)

通过适配器匹配不同接口的设计模式称为适配器模式;在软件设计中,为了解决接口不一致的问题,需要一个适配器类

适配器模式分类:Class adapter patternObject adapter pattern

①Class adapter pattern

关键点:添加一个目标接口,在目标接口中声明 Operation1 和 Operation2 方法;添加一个 Adapter 类,从 Adaptee 类继承 Operation1 方法,并在目标接口中实现 Operation2 方法

Target:Desire interface;Adaptee:An inherited class;Adapter:Adapter class

例子:某公司购买了一个现成产品InfoValidation类,用于验证信息。该类可以验证用户的姓名、地址、电话号码,但不能验证身份证号码(IDN)。现在需要添加验证身份证号码的方法

②Object adapter pattern

在 Adaptee1 类中有一个 Operation1() 方法,在 Adaptee2 类中有一个 Operation2() 方法。 客户希望同时使用 Operation1、Openration2 和一个额外的 Operation3 方法。怎么办?

关键点:所有方法 Operation1、Operation2 和 Operation3 都在 Target 接口中声明;将 Adaptee1 和 Adaptee2 这两个类聚合到 Adapter 类中;Adapter类通过直接调用这两个方法来实现这两个方法,并自行实现Operation3

适配器模式的作用:Interface conversion;Adding new interface

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五倍子的代码空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值