目录
2.4 The Simple Factory Pattern
2.Adapter design pattern适配器设计模式(满足开闭原则)
0.前言
本系列文章旨在软件设计与体系结构的知识点,资料来源四川大学授课内容,可用于期末复习,笔者理解尚浅,文中不正之处静待批正。加粗部分为重点。
![](https://i-blog.csdnimg.cn/blog_migrate/9edf2c65e8ad3cfeba36b4a880cab2a5.png)
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 pattern;Object 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