第6章 抽象工厂模式
抽象工厂模式的优缺点和适用场景
抽象⼯⼚模式的优缺点和适⽤场景
抽象⼯⼚模式的优点
抽象⼯⼚模式除了具有⼯⼚⽅法模式的优点外,最主要的优点就是可以在类的内部对产品族进⾏约束。
所谓的产品族,⼀般或多或少的都存在⼀定的关联,抽象⼯⼚模式就可以在类内部对产品族的关联关系进⾏定义和描述,⽽不必专门引⼊⼀个新的类来进⾏管理。
抽象⼯⼚模式的缺点
产品族的扩展将是⼀件⼗分费⼒的事情,假如产品族中需要增加⼀个新的产品,则⼏乎所有的⼯⼚类都需要进⾏修改。
所以使⽤抽象⼯⼚模式时,对产品等级结构的划分是⾮常重要的。
适⽤场景
当需要创建的对象是⼀系列相互关联或相互依赖的产品族时,便可以使⽤抽象⼯⼚模式。
说的更明⽩⼀点,就是⼀个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着⼀定的关联或者约束,就可以使⽤抽象⼯⼚模式。
假如各个等级结构中的实现类之间不存在关联或约束,则使⽤多个独⽴的⼯⼚来对产品进⾏创建,则更合适⼀点。
总结
⽆论是简单⼯⼚模式,⼯⼚⽅法模式,还是抽象⼯⼚模式,他们都属于⼯⼚模式,在形式和特点上也是极为相似的,他们的最终⽬的都是为了解耦。
在使⽤时,我们不必去在意这个模式到底⼯⼚⽅法模式还是抽象⼯⼚模式,因为他们之间的演变常常是令⼈琢磨不透的。
经常你会发现,明明使⽤的⼯⼚⽅法模式,当新需求来临,稍加修改,加⼊了⼀个新⽅法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象⼯⼚模式了;⽽对于抽象⼯⼚模式,当减少⼀个⽅法使的提供的产品不再构成产品族之后,它就演变成了⼯⼚⽅法模式。
所以,在使⽤⼯⼚模式时,只需要关⼼降低耦合度的⽬的是否达到了。
简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。
(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。
随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。
当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。
2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。
设计模式就是为了抵御外部需求变化产⽣的。
设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。
)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。
综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。
抽象模式
简单工厂模式优缺点
简单工厂模式优点: • 令创建与使用的代码相分离,降低了耦合性,可以独立变化
简单工厂模式缺点: 工厂类集中了所有产品创建的逻辑,会导致很复杂 将所有逻辑集中放在一个类里,当产品类有不同接口种类时, 工厂类需要判断何时创建何种产品。这种对时机的逻辑判断 与对哪种具体产品的逻辑判断混合在一起,导致扩展困难。 工厂方法为静态方法,无法由子类继承
实现独一无二的实例
如何创建一个对象?
new
一旦有一个类,是否可以多次实例化?
当然可以
如果构造函数为private呢?
可以,但在类外无法实例化
如何调用呢?
通过一个静态方法获得类的实例
public MyClass 问题解决了!! { private MyClass(){} public static MyClass GetInstance(){} } 演示示例:使用单例模式解决问题
剖析经典的单例模式
public class FrmPlayer { Singleton类 //独一无二的实例 private static FrmPlayer uniquePlayer; 利用一个静态变量来记录 //私有构造函数 Singleton类的唯一实例 private FrmPlayer() { InitializeComponent(); 构造函数声明为私有,只有 Singleton类才可以调用 } //检查并创建唯一实例 public static FrmPlayer GetInstance() { if (uniquePlayer == null) { uniquePlayer = new FrmPlayer(); } return uniquePlayer; 实例化对象,并返回 } 实例引用 }
利用案例教学法由浅入深地讲解抽象工厂模式
#一:
. .
聱
一 … - “
舻 s
…
i
冀
。
董 篡一 e … !
; 一
?
_ * 悯
t 一
s
:
蠢静黔 i 薄
菇
囊
j Leabharlann 之 , 就是这些抽象产 品的具体子类的实例 。工厂类负责创建抽 也 象 产 品 的 具 体 子类 的 实 例 。
第二 阶段 : 首先给学生提 出问题 : 口就可 以实现访 问不 同 接 的数据库我们为什么采用工厂模式 呢?原 因有两个 : 第一是 客户 提 出新需求 , 自己不改变源码就更换 为其他数据库 ; 第二是从 开 发公 司考虑 , 了适应不 同的数据库 , 为 每次需要修 改 B L层源代 L 码 , 编译程序 , 再 发布程序 比较麻烦 。 那么具体实现步骤是创建新 的工 厂项 目类 , 加类 S at y 然后在类 中实 现返 回实现产 品 添 F c r, o 接 口的 方 法 , 体 代 码 如 下 : 具
摘 要 : 文 章 主 要 阐述 了抽 象 工 厂 模 式 , 过 利 用 案 例 教 学 法进 行 讲 解 , 学 员彻 底 理 通 让 解 并会 使 用抽 象 工厂 设 计 模 式 。 关 键 词 :抽 象 工厂 模 式 ; 案例 教 学 法 ; 解 讲 中 图分 类 号 :G7 2 1 文 献 标 识 码 :A 文 章 编 号 :0 0 83 (0 03 — 17 O 10 — 1 6 1)2 0 0 一 3 2
科 学 之友
Fed f c ne m t r rn oS i c A a u i e e s
21年1月 00 1
利 用 案 例 教 学 法 由浅 入 深地 讲 解 抽 象 工厂 模 式
实验3 抽象工厂模式
}
publicView produce2() {
System.out.println("2over");
returnnewAndroid2();
}
}
classSymbinFactoryimplementsFactory {
publicSymbin produce1() {
{ห้องสมุดไป่ตู้
publicvoidcreate() {
System.out.println("mac'sCPU");
}
}
classPcRAMimplementsRAM {
publicvoidcreate() {
System.out.println("winRAM");
}
}
classMacRAMimplementsRAM {
publicvoidcreate() {
System.out.println("mac'RAM");
}
}
interfaceComputerFactory {
CPU produceCPU();
RAM produceRAM();
}
classPcFactoryimplementsComputerFactory {
System.out.println("sys view");
}
}
interfaceFactory {
Contral produce1();
View produce2();
}
classPhoneFactoryimplementsFactory {
软件设计模式试题集_附答案
第 7 章 Adapter(适配器)模式
一.选择
1. Adapter(适配器)模式的意图是()。
A. 希望简化现有系统的使用方法。你需要定义自己的借口。
B.将一个无法控制的现有对象与一个特定借口相匹配。
C. 将一组实现部分从另一组使用它们的对象中分离出来。
D.你需要为特定的客户(或情况)提供特定系列的对象。
包容类与需要的接口相匹配,并调用被包容类的方法。
4. 请简要说明在软件设计中设计模式的作用?
软件设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结。
使用设计模式是为了适应需求变化、可重用代码、让代码更容易被他人理解、保证代码的可靠性。
六.应用题
4. 在 Facade 模式中,客户是如何使用子系统的?
六.应用题
1. 请论述在一个系统中应用 Façade(外观)模式的必要性,并给出一种解决方案。
Façade(外观)模式不仅可以为方法调用创建更简单的接口,还可以减少客户必须处理的对象数量。举个例子。
假设有一个 Client 对象,这个对象必须处理 Database、Model、Element 类的对象。Client 必须首先通过 Database
B.为了系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用。
C.保证一个类仅有一个实例,并提供一个访问他的全局访问点。
D.在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现。
2. Façade(外观)模式的意图是()。
A. 希望简化现有系统的使用方法,你需要定义自己的接口。
4. 内聚度
模块内部各成分彼此结合的紧密程度。
简单工厂模式,工厂方法模式和抽象工厂模式的异同
简单工厂模式,工厂方法模式和抽象工厂模式的异同简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。
我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。
用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。
一.特点简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
它又称为静态工厂方法模式。
它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
在这个模式中,工厂类是整个模式的关键所在。
它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。
有利于整个软件体系结构的优化。
工厂方法模式:工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。
提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭原则’,实现了可扩展。
其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式是对简单工厂模式进行了抽象。
有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
在这个模式中,工厂类和产品类往往可以依次对应。
即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
【设计模式-工厂模式】男男女女的抽象工厂模式
【设计模式-⼯⼚模式】男男⼥⼥的抽象⼯⼚模式背景虽然⼥娲已经成功将⼈类创造出来了,可是都是没有性别的,那么后续该如何繁衍呢。
为此,除了增加⼈种外,我们还需要增加所有⼈类都有的⼀个属性:性别。
由此:⼈种和性别相互组合⽣成6中不同的⼈类男⿊⼈、⼥⿊⼈、男⽩⼈、⼥⽩⼈、男黄⼈、⼥黄⼈原来的⼀个⼋卦炉也需要进⾏修改,变为专门⽣产男性的"男⼋卦炉" 和专门⽣产⼥性的 “⼥⼋卦炉”类图可以看到我们在原有的⼏个⼈种上,⼜重新继承并实现了两个类,分别⽤于表⽰不同⼈种的男⼥特别说明的是HumanFactory接⼝,在这个接⼝中定义了三个⽅法,分别⽤于⽣产不同的肤⾊的⼈种,也就是我们将肤⾊作为Y轴,性别作为X轴,通过X坐标和Y坐标唯⼀确定⼀个⽣产出来的对象。
代码⼈种接⼝public interface Human {//每个⼈种的⽪肤都是不同的颜⾊public void getColor();//每个⼈类都会发声public void talk();public void getSex();}⼈种接⼝即抽象产品,该产品的共同属性定义:肤⾊和语⾔,⽽性别则是不同产品下更深层的细分实现⼈种接⼝的黄种⼈public abstract class AbstractYellowHuman implements Human{@Overridepublic void getColor() {System.out.println("黄种⼈");}@Overridepublic void talk() {System.out.println("国语");}}继承了该接⼝的抽象黄种⼈类,每个抽象类都会实现产品的公共细节,⽽每个抽象类的都会有两个实现类,分别实现各⾃的不同的细节:性别黄种⼈⼥性public class YellowWoman extends AbstractYellowHuman{@Overridepublic void getSex() {System.out.println("YellowWoman");}}⼋卦炉/*** 产品类* 有N个产品组,在抽象⼯⼚类中就应该有N个创建⽅法;* 每个产品有M个产品扩展维度就应该有M个产品实现⼯⼚类,* 在每个实现⼯⼚中,实现不同的产品族的⽣产任务.* @author LiPeng01* @since 2020/8/8 7:31 下午*/public interface HumanFactory {public Human doYellowHuman();public Human doWhiteHuman();public Human doBlackHuman();}在接⼝中我们可以看到 抽象的⼯⼚是可以⽣产出不同肤⾊的⼈种的。
设计模式(简单工厂,工厂方法,抽象工厂)区别
第一种表述简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。
其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。
简单工厂简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
工厂方法工厂方法是针对每一种产品提供一个工厂类。
通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
抽象工厂抽象工厂是应对产品族概念的。
比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结★工厂模式中,重要的是工厂类,而不是产品类。
产品类可以是多种形式,多层继承或者是单个类都是可以的。
但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别简单工厂:用来生产同一等级结构中的任意产品。
(对于增加新的产品,无能为力)工厂模式:用来生产同一等级结构中的固定产品。
(支持增加任意产品)抽象工厂:用来生产不同产品族的全部产品。
(对于增加新的产品,无能为力;支持增加产品族)以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。
所以要根据情况考虑应该使用哪种方法。
第二种表述简单工厂、工厂方法和抽象工厂都是创建型的设计模式。
三者的共同点是:1、都有两种作用不同的类:产品类和工厂类。
其中,工厂类在自己的方法中实例化产品类(即使用new命令生成产品类的对象),并将生成的产品类的对象提供给外部使用。
2、创建的过程,都是类似的:工厂类得到一个标志(可以由程序输入,也可以读取配置文件中的内容),返回一个产品对象。
深入浅出设计模式-电子版
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由 一个具体类实现。
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽 象类来实现。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 来用类图来清晰的表示下的它们之间的关系(如果对类图不太了解,请参考我关于类图
我们还是老规矩,使用一个完整的例子来看看工厂模式各个角色之间是如何来协调的。 话说暴发户生意越做越大,自己的爱车也越来越多。这可苦了那位司机师傅了,什么车它都 要记得,维护,都要经过他来使用!于是暴发户同情他说:看你跟我这么多年的份上,以后 你不用这么辛苦了,我给你分配几个人手,你只管管好他们就行了!于是,工厂方法模式的 管理出现了。代码如下:
retusIgnoreCase("Bmw"))
return new Bmw(); ...... else throw new Exception(); 。。。
//欢迎暴发户出场......
public class Magnate{ public static void main(String[] args){ try{ //告诉司机我今天坐奔驰 Car car = Driver.driverCar("benz"); //下命令:开车 car.drive(); 。。。
四、工厂方法模式 工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这
样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分 担。
你应该大致猜出了工厂方法模式的结构,来看下它的组成: 1) 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须
软件设计模式(总结归纳)
1. 工厂模式和抽象工厂模式相同点:在两种工厂模式在被使用的时候都能产生具体的产品类,比直接创建对象更加灵活!不同点:工厂模式只有一个抽象产品类,而抽象工厂模式可以有多个!工厂模式的具体工厂类只能创建一个具体类的实例,而抽象工厂模式则可以创建多个!2.抽象工厂模式和建造者模式相同点:都能生产出具体的产品类不同点:抽象工厂模式是定义一个创建对象的接口,让子类决定实现哪一个类,抽象工厂使其子类延迟到其子类,其本身是没有状态的。
建造者模式是将一个复杂对象的创建与他的表示分离,使同样的构造过程可以创建不同的表示,其是有状态的,比抽象工厂更加灵活(比较之下,抽象工厂处于更加具体的尺度上,而建造者模式处于更加宏观的尺度上)!3.类适配器和对象适配器对象适配器:不是通过继承的方式,而是通过对象组合的方式来进行处理的,我们只要学过OO的设计原则的都知道,组合相比继承是推荐的方式。
类适配器:通过继承的方式来实现,将旧系统的方法进行封装。
对象适配器在进行适配器之间的转换过程中,无疑类适配器也能完成,但是依赖性会加大,并且随着适配要求的灵活性,可能通过继承膨胀的难以控制。
【一般来说类适配器的灵活性较差,对象适配器较灵活,是我们推荐的方式,可以通过依赖注入的方式,或者是配置的方式来做。
类适配器需要继承自要适配的旧系统的类,无疑这不是一个好的办法。
】4.装饰,组合和责任链模式装饰模式是一个链型的组织关系,而组合模式是一个集合的组织关系,也就是说组合模式必须有一个类是组合的容器,它包含了所有组合模式中的功能类,而装饰模式任何一个类都是链上的一个节点而已。
但是这里装饰模式和组合模式没有优劣之分,只是适合的场景不一样,模式本身就是没有优劣之分,只是各自适合不同的场景。
而在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
23种设计模式的经典运用
23种设计模式的经典运用介绍设计模式是解决软件设计中常见问题的可重复使用的解决方案。
本文将介绍23种经典的设计模式,并给出它们在实际开发中的应用示例。
通过学习这些设计模式,您将增加对软件设计的理解,并能够更好地解决问题。
创建型设计模式1.工厂方法模式(F a c t o r y M e t h o d)工厂方法模式通过定义一个创建对象的接口,但由子类决定实例化具体类。
这种方法可以延迟实例化过程,具有更高的灵活性和可扩展性。
应用场景:-在一个系统中,希望客户端与具体类的实例化解耦。
-希望通过增加具体类的扩展来增加系统的灵活性。
2.抽象工厂模式(A b s t r a c t F a c t o r y)抽象工厂模式提供一个接口,用于创建相关或依赖对象组。
这种模式将对象的实例化推迟到子类中,从而实现了解耦。
应用场景:-当一个系统独立于其产品的创建、组合和表示时。
-当需要一个系列的相互依赖的对象而无需指定其具体类时。
3.单例模式(S i n gl e t o n)单例模式确保一个类只有一个实例,并提供一个全局访问点。
这种模式常用于控制对资源的访问,例如数据库连接或日志文件。
应用场景:-当需要一个类的唯一实例,并且该实例需要被多个客户端共享时。
-当需要限制系统中特定类的实例数量时。
4.原型模式(P r o to t y p e)原型模式通过复制现有对象来创建新对象。
这种模式对于创建需要消耗大量资源的对象非常有用,可以通过克隆现有对象来提高性能。
应用场景:-当一个系统的某些对象的创建比较昂贵时。
-当需要避免构造函数调用,而直接通过复制现有对象来创建新对象时。
5.建造者模式(B ui l d e r)建造者模式将一个复杂对象的构建过程与其表现分离,使得相同的构建过程可以创建不同的表现。
应用场景:-当想要构建一些复杂对象时,如生成器。
-当需要创建对象的过程具有多个步骤,并且每个步骤都可以按需选择或省略时。
结构型设计模式6.适配器模式(A da p t e r)适配器模式将一个类的接口转换为客户端所期望的另一个接口。
工厂模式的三种类型
工厂模式的三种类型工厂模式的三种类型:1抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
1.抽象化工厂(creator)角色抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2.具体内容工厂(concretecreator)角色具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
3.抽象化(product)角色抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体内容产品(concreteproduct)角色抽象化模式所建立的具体内容实例对象总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。
2工厂方法模式同样属类的建立型模式又被表示为多态工厂模式。
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
1.抽象化工厂(creator)角色工厂方法模式的核心,任何工厂类都必须实现这个接口。
2.具体内容工厂(concretecreator)角色具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
3.抽象化(product)角色工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体内容产品(concreteproduct)角色工厂方法模式所建立的具体内容实例对象工厂方法模式与简单工厂模式在结构上的不同不是很明显。
工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以存有一个别名为多态性工厂模式是因为具体内容工厂类都存有共同的USB,或者存有共同的抽象化父类。
Java设计模式知识要点
AbstractClass 叫做抽象模板,它的方法分为两类: ● 基本方法 基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。 ● 模板方法 可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调 度,完成固定的逻辑。 注意: 为了防止恶意的操作,一般模板方法都加上 final 关键字,不允许被覆 写。 具体模板:ConcreteClass1 和 ConcreteClass2 属于具体模板,实现父类所定义的 一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现 使用场景: ● 多个子类有公有的方法,并且逻辑基本相同时。 ● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由 各个子类实现。 ● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然 后通过钩子函数(见“模板方法模式的扩展”)约束其行为。
2.工厂模式
定义:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类 的实例化延迟到其子类。)
抽象工厂模式(PPT31页)-文档资料
Button
Text
一个产品族 产品等级结构
抽象工厂模式
模式分析
抽象工厂模式
模式分析
✓ 抽象工厂类的典型代码如下:
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); }
抽象工厂模式
模式实例与解析
✓ 实例一:电器工厂
抽象工厂模式
模式实例与解析
✓ 实例一:电器工厂
• 参考代码 (Chapter 06 Abstract Factory\sample01)
演示……
抽象工厂模式
模式实例与解析
✓ 实例二:数据库操作工厂
• 某系统为了改进数据库操作的性能,自定义数据库连接对象 Connection和语句对象Statement,可针对不同类型的数据库提 供不同的连接对象和语句对象,如提供Oracle或SQL Server专用 连接类和语句类,而且用户可以通过配置文件等方式根据实际 需要动态更换系统数据库。使用抽象工厂模式设计该系统。
模式分析
Button
Text
UnixButton LinuxButton WindowsButton
UnixText LinuxText WindowsText
抽象工厂模式
模式分析
产品族
Windows WindowsButton WindowsText
Unix Linux
UnixButton LinuxButton
而使客户端不依赖于具体实现。
《C#设计模式(第2版)》教学大纲
《C#设计模式》教学大纲一、课程说明1、课程编号:2、课程名称(中/英文):C#设计模式/C# Design Patterns3、课程类别:专业课4、学时/学分:32/2.05、先修课程:C#面向对象程序设计、软件工程6、适用专业:软件工程,计算机科学与技术,信息管理与信息系统7、教材、教学参考书:[1] 刘伟, 胡志刚. C#设计模式(第2版). 北京: 清华大学出版社, 2018.[2] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software.Addison-Wesley, 1995.[3] James W. Cooper. C#设计模式. 北京: 科学出版社, 2011.二、课程性质和教学目的《C#设计模式》是软件工程、计算机科学与技术、信息管理与信息系统等专业本科生的一门专业课,本课程是一门具有较强理论性和实践性的软件设计和开发类课程。
本课程主要学习设计模式基础知识、UML类图、面向对象设计原则、常用的创建型设计模式、结构型设计模式和行为型设计模式。
本课程要求学生掌握常用设计模式的动机、定义、结构、实现、使用效果以及应用实例,能够将所学知识应用到C#项目设计与开发中,进一步培养学生的工程实践能力和专业技术水平,为今后从事相关工作奠定基础。
本课程首先学习设计模式的基本知识和UML类图;接着介绍常见的七个面向对象设计原则;然后重点介绍使用频率较高的设计模式,包括五种创建型设计模式(简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、单例模式)、六种结构型设计模式(适配器模式、桥接模式、组合模式、装饰模式、外观模式、代理模式)和七种行为型设计模式(职责链模式、命令模式、迭代器模式、观察者模式、状态模式、策略模式、模板方法模式)。
Abstract Factory模式详解及应用场景
Abstract Factory模式详解及应用场景Abstract Factory模式是一种软件设计模式,它是工厂方法模式的升级版。
它的作用是提供一种统一的接口,用来创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
抽象工厂可以看做一种工厂的工厂,它管理着一系列的工厂,每个工厂负责创建一组对象。
下面将详细介绍Abstract Factory的工作原理及应用场景。
一、工作原理Abstract Factory模式分为抽象工厂、具体工厂、抽象产品、具体产品四个部分。
其中,抽象工厂和抽象产品是组成Abstract Factory模式最关键的两部分。
抽象工厂(Abstract Factory):抽象工厂是一个接口,它声明了一组用于创建一系列产品的方法。
每个方法都对应于某一种产品。
具体工厂(Concrete Factory):具体工厂是抽象工厂的子类,它实现了所有在抽象工厂中声明的方法,用于创建具体产品。
抽象产品(Abstract Product):抽象产品是一个接口,它声明了一组用于具体产品的共同属性和方法。
具体产品(Concrete Product):具体产品是实现抽象产品中定义的接口的对象,它通过具体工厂创建。
下面用一个例子来说明Abstract Factory模式的工作原理。
假设在一个电商平台上,有两个商家A和B,他们都销售服装,分别有衣服和裤子两种产品。
要实现Abstract Factory模式,需要先定义抽象产品和抽象工厂。
抽象产品```java// 衣服抽象产品public interface Clothes {public void show();}// 裤子抽象产品public interface Pants {public void show();}```抽象工厂```java// 抽象工厂public interface Factory {public Clothes createClothes();public Pants createPants();}```接下来,定义商家A和B的具体产品和具体工厂。
抽象工厂模式的应用场景
抽象工厂模式的应用场景抽象工厂模式是一种常用的设计模式,其主要作用是抽象出一个工厂接口,然后具体的工厂实现基于该接口构建不同的产品。
这种设计模式在实际开发中有着广泛的应用,下面就来详细探讨其在不同场景下的使用情况。
一、Web应用中的抽象工厂模式在Web应用中,抽象工厂模式非常常见。
例如,一个在线咖啡厅网站,其需要实现不同种类的饮品,包括浓缩咖啡、卡布奇诺、拿铁等等。
此时,可以采用抽象工厂模式,将饮品的种类作为产品族,不同种类的饮品则是产品族中的不同产品。
这样,每个饮品可以由一个具体的工厂类来构建,而所有的工厂类都可以基于同一个抽象工厂接口来实现。
二、游戏开发中的抽象工厂模式在游戏开发中,抽象工厂模式同样可以起到重要作用。
例如,一个游戏中需要不同种类的武器和防具,可以将武器和防具视为不同的产品族,每个具体的武器或防具则是产品族中的不同产品。
此时,可以采用抽象工厂模式来构建不同的工厂类,每个工厂类负责创建不同种类的武器或防具。
这样,通过简单的修改工厂类,就可以很容易地扩展游戏的武器和防具系统。
三、操作系统开发中的抽象工厂模式在操作系统开发中,抽象工厂模式也有着广泛的应用。
例如,操作系统中包含多个不同种类的进程调度算法,每个算法都是进程调度算法族中的不同产品。
此时,可以采用抽象工厂模式,将进程调度算法族作为产品族,每个具体的进程调度算法则是产品族中的不同产品。
通过简单的切换不同的工厂类,就可以实现不同的进程调度算法。
总结:抽象工厂模式是一种常用的设计模式,在实际开发中有着广泛的应用。
通过将对象的构造与产品族进行分离,我们可以很容易地扩展系统的功能,同时还可以提高代码的可维护性和可扩展性。
无论是Web应用、游戏开发、还是操作系统开发,抽象工厂模式都可以为我们提供很好的解决方案。
抽象工厂设计模式的实验报告
public: Rectangle1() {
std::cout<<"Rectangle1\n"; } };
// 具体产品 Line2 class Line2 : public DrawLine { public:
Line2() { std::cout<<"Line2\n"; } };
// 具体产品 Dot2 class Dot2 : public DrawDot { public:
一、实验目的 使用抽象工厂模式实现一个图形界面,其中的图形包括:文本(Text),矩形(Rectangle),
点(Dot),线(Line)。 二、实现方法 1 采用 VC++环境 2 采用工厂的设计模式 三、模式的思想 提供一个创建一系列相关或相互依赖对象的接口,而不需指定他们具体的类 四、模式设计的 UML 类图的绘制
五、程序源代码 #include<stdio.h> #include<iostream> // 抽象产品 DrawLine class DrawLine { }; // 抽象产品 DrawDot class DrawDot { };
// 抽象产品 DrawText class DrawText {
std::cout<<"Rectangle2\n";
} };
class AbstractFactory {
public: virtual DrawLine* CreateLine()=0; virtual DrawDot* CreateDot()=0; virtual DrawText* CreateText()=0; virtual DrawRectangle* CreateRectangle()=0;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
抽象工厂模式
模式结构
抽象工厂模式
模式结构
抽象工厂模式包含如下角色: 抽象工厂模式包含如下角色:
• AbstractFactory:抽象工厂 • ConcreteFactory ConcreteFactory:具体工厂 • AbstractProduct:抽象产品 • Product:具体产品
抽象工厂模式
抽象工厂模式
模式扩展
“开闭原则”的倾斜性 开闭原则”
• “开闭原则”要求系统对扩展开放,对修改封闭,通过扩展达到增强其功 能的目的。对于涉及到多个产品族与多个产品等级结构的系统,其功能增 强包括两方面: • (1) 增加产品族:对于增加新的产品族,工厂方法模式很好的支持了“开闭 原则”,对于新增加的产品族,只需要对应增加一个新的具体工厂即可, 对已有代码无须做任何修改。 • (2) 增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的 工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的 方法,不能很好地支持“开闭原则”。 • 抽象工厂模式的这种性质称为“开闭原则”的倾斜性,抽象工厂模式以一 种倾斜的方式支持增加新的产品,它为新产品族的增加提供方便,但不能 为新的产品等级结构的增加提供这样的方便。
抽象工厂模式
模式分析
具体工厂类的典型代码如下: 具体工厂类的典型代码如下:
public class ConcreteFactory1 extends AbstractFactory { public AbstractProductA createProductA() { return new ConcreteProductA1(); } public AbstractProductB createProductB() { return new ConcreteProductB1(); } }
抽象工厂模式
模式适用环境
在以下情况下可以使用抽象工厂模式: 在以下情况下可以使用抽象工厂模式:
• 一个系统不应当依赖于产品类实例如何被创建、组合和表达的 细节,这对于所有类型的工厂模式都是重要的。 • 系统中有多于一个的产品族,而每次只使用其中某一产品族。 • 属于同一个产品族的产品将在一起使用,这一约束必须在系统 的设计中体现出来。 • 系统提供一个产品类的库,所有的产品以同样的接口出现,从 而使客户端不依赖于具体实现。
抽象工厂模式
模式动机
抽象工厂模式示意图
抽象工厂模式
模式定义
抽象工厂模式(Abstract Factory Pattern):提供一 抽象工厂模式 : 创建一系列相关或相互依赖对象的接口, 个创建一系列相关或相互依赖对象的接口,而无须指定 它们具体的类。抽象工厂模式又称为Kit模式,属于对 它们具体的类。抽象工厂模式又称为 模式,属于对 模式 象创建型模式。 象创建型模式。
END
抽象工厂模式
模式实例与解析
实例二: 实例二:数据库操作工厂
抽象工厂模式
模式优缺点
抽象工厂模式的优点
• 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创 建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体 工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工 厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应 用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模 式得到了广泛的应用。 • 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端 始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决 定其行为的软件系统来说,是一种非常实用的设计模式。 • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭 原则”。
模式实例与解析
实例一: 实例一:电器工厂
抽象工厂模式
模式实例与解析
实例一: 实例一:电器工厂
• 参考代码 (Chapter 06 Abstract Factory\sample01)
演示…… 演示
抽象工厂模式
模式实例与解析
实例二: 实例二:数据库操作工厂
• 某系统为了改进数据库操作的性能,自定义数据库连接对象 Connection和语句对象Statement,可针对不同类型的数据库提 供不同的连接对象和语句对象,如提供Oracle或SQL Server专用 连接类和语句类,而且用户可以通过配置文件等方式根据实际 需要动态更换系统数据库。使用抽象工厂模式设计该系统。
抽象工厂模式
模式优缺点
抽象工厂模式的缺点
• 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产 品,这是因为在抽象工厂角色中规定了所有可能被创建的产品 集合,要支持新种类的产品就意味着要对该接口进行扩展,而 这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来 较大的不便。 • 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产 品等级结构麻烦)
抽象工厂模式
模式动机
产品族与产品等级结构示意图
抽象工厂模式
模式动机
当系统所提供的工厂所需生产的具体产品并不是一个简单的对象, 当系统所提供的工厂所需生产的具体产品并不是一个简单的对象, 多个位于不同产品等级结构中属于不同类型的具体产品时需要 而是多个位于不同产品等级结构中属于不同类型的具体产品时 而是多个位于不同产品等级结构中属于不同类型的具体产品时需要 使用抽象工厂模式。 使用抽象工厂模式。 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一 种形态。 种形态。 抽象工厂模式与工厂方法模式最大的区别在于, 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对 的是一个产品等级结构, 的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级 结构, 结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品 对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等 级结构的一个产品族中的所有对象时, 级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模 式更为简单、有效率。 式更为简单、有效率。
抽象工厂模式
模式动机
为了更清晰地理解工厂方法模式,需要先引入两个概念: 为了更清晰地理解工厂方法模式,需要先引入两个概念: • 产品等级结构:产品等级结构即产品的继承结构,如一个抽象 类是电视机,其子类有海尔电视机、海信电视机、TCL电视机, 则抽象电视机与具体品牌的电视机之间构成了一个产品等级结 构,抽象电视机是父类,而具体品牌的电视机是其子类。 • 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的, 位于不同产品等级结构中的一组产品,如海尔电器工厂生产的 海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结 构中,海尔电冰箱位于电冰箱产品等级结构中。
本章小结
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无 须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型 模式。 抽象工厂模式包含四个角色:抽象工厂用于声明生成抽象产品的方法; 具体工厂实现了抽象工厂声明的生成抽象产品的方法,生成一组具体 产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级 结构中;抽象产品为每种产品声明接口,在抽象产品中定义了产品的 抽象业务方法;具体产品定义具体工厂生产的具体产品对象,实现抽 象产品接口中定义的业务方法。 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种 形态。抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式 针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等 级结构。
模式分析
Button Text
UnixButton
LinuxButton
WindowsButton
UnixText
LinuxText
WindowsText
抽象工厂模式
模式分析
抽象工厂模式
模式分析
抽象工厂模式
模式分析
抽象工厂类的典型代码如下: 抽象工厂类的典型代码如下:
public abstract class AbstractFactory { public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); }
抽象工厂模式
模式扩展
工厂模式的退化
• 当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是 只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式; 当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂 来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工 厂方法模式退化成简单工厂模式。
抽象工厂模式
模式实例与解析
实例一: 实例一:电器工厂
• 一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产 海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL 空调等,相同品牌的电器构成一个产品族,而相同类型的电器 构成了一个产品等级结构,现使用抽象工厂模式模拟该场景。
抽象工厂模式
抽象工厂模式
模式应用
(1) Java SE AWT(抽象窗口工具包) (抽象窗口工具包)
• 在Java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模 式,它使用抽象工厂模式来实现在不同的操作系统中应用程序 呈现与所在操作系统一致的外观界面。
抽象工厂模式
模式应用
(2) 在很多软件系统中需要更换界面主题,要求界面中 在很多软件系统中需要更换界面主题, 的按钮、文本框、背景色等一起发生改变时, 的按钮、文本框、背景色等一起发生改变时,可以使用 抽象工厂模式进行设计。 抽象工厂模式进行设计。
本章小结
抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要 知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的 多个对象,增加或者替换产品族比较方便,增加新的具体工厂和产品 族很方便;主要缺点在于增加新的产品等级结构很复杂,需要修改抽 象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。 抽象工厂模式适用情况包括:一个系统不应当依赖于产品类实例如何 被创建、组合和表达的细节;系统中有多于一个的产品族,而每次只 使用其中某一产品族;属于同一个产品族的产品将在一起使用;系统 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端 不依赖于具体实现。