第6章 抽象工厂模式
- 格式:ppt
- 大小:1.10 MB
- 文档页数:31
抽象⼯⼚模式的优缺点和适⽤场景
抽象⼯⼚模式的优点
抽象⼯⼚模式除了具有⼯⼚⽅法模式的优点外,最主要的优点就是可以在类的内部对产品族进⾏约束。
所谓的产品族,⼀般或多或少的都存在⼀定的关联,抽象⼯⼚模式就可以在类内部对产品族的关联关系进⾏定义和描述,⽽不必专门引⼊⼀个新的类来进⾏管理。
抽象⼯⼚模式的缺点
产品族的扩展将是⼀件⼗分费⼒的事情,假如产品族中需要增加⼀个新的产品,则⼏乎所有的⼯⼚类都需要进⾏修改。
所以使⽤抽象⼯⼚模式时,对产品等级结构的划分是⾮常重要的。
适⽤场景
当需要创建的对象是⼀系列相互关联或相互依赖的产品族时,便可以使⽤抽象⼯⼚模式。
说的更明⽩⼀点,就是⼀个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着⼀定的关联或者约束,就可以使⽤抽象⼯⼚模式。
假如各个等级结构中的实现类之间不存在关联或约束,则使⽤多个独⽴的⼯⼚来对产品进⾏创建,则更合适⼀点。
总结
⽆论是简单⼯⼚模式,⼯⼚⽅法模式,还是抽象⼯⼚模式,他们都属于⼯⼚模式,在形式和特点上也是极为相似的,他们的最终⽬的都是为了解耦。
在使⽤时,我们不必去在意这个模式到底⼯⼚⽅法模式还是抽象⼯⼚模式,因为他们之间的演变常常是令⼈琢磨不透的。
经常你会发现,明明使⽤的⼯⼚⽅法模式,当新需求来临,稍加修改,加⼊了⼀个新⽅法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象⼯⼚模式了;⽽对于抽象⼯⼚模式,当减少⼀个⽅法使的提供的产品不再构成产品族之后,它就演变成了⼯⼚⽅法模式。
所以,在使⽤⼯⼚模式时,只需要关⼼降低耦合度的⽬的是否达到了。
简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。
(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。
随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。
当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。
2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。
设计模式就是为了抵御外部需求变化产⽣的。
设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。
)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。
综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。
简单工厂模式,工厂方法模式和抽象工厂模式的异同简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。
我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。
用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。
一.特点简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
它又称为静态工厂方法模式。
它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
在这个模式中,工厂类是整个模式的关键所在。
它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。
有利于整个软件体系结构的优化。
工厂方法模式:工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。
提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭原则’,实现了可扩展。
其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式是对简单工厂模式进行了抽象。
有一个抽象的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. 工厂模式和抽象工厂模式相同点:在两种工厂模式在被使用的时候都能产生具体的产品类,比直接创建对象更加灵活!不同点:工厂模式只有一个抽象产品类,而抽象工厂模式可以有多个!工厂模式的具体工厂类只能创建一个具体类的实例,而抽象工厂模式则可以创建多个!2.抽象工厂模式和建造者模式相同点:都能生产出具体的产品类不同点:抽象工厂模式是定义一个创建对象的接口,让子类决定实现哪一个类,抽象工厂使其子类延迟到其子类,其本身是没有状态的。
建造者模式是将一个复杂对象的创建与他的表示分离,使同样的构造过程可以创建不同的表示,其是有状态的,比抽象工厂更加灵活(比较之下,抽象工厂处于更加具体的尺度上,而建造者模式处于更加宏观的尺度上)!3.类适配器和对象适配器对象适配器:不是通过继承的方式,而是通过对象组合的方式来进行处理的,我们只要学过OO的设计原则的都知道,组合相比继承是推荐的方式。
类适配器:通过继承的方式来实现,将旧系统的方法进行封装。
对象适配器在进行适配器之间的转换过程中,无疑类适配器也能完成,但是依赖性会加大,并且随着适配要求的灵活性,可能通过继承膨胀的难以控制。
【一般来说类适配器的灵活性较差,对象适配器较灵活,是我们推荐的方式,可以通过依赖注入的方式,或者是配置的方式来做。
类适配器需要继承自要适配的旧系统的类,无疑这不是一个好的办法。
】4.装饰,组合和责任链模式装饰模式是一个链型的组织关系,而组合模式是一个集合的组织关系,也就是说组合模式必须有一个类是组合的容器,它包含了所有组合模式中的功能类,而装饰模式任何一个类都是链上的一个节点而已。
但是这里装饰模式和组合模式没有优劣之分,只是适合的场景不一样,模式本身就是没有优劣之分,只是各自适合不同的场景。
而在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
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,或者存有共同的抽象化父类。
《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):抽象工厂是一个接口,它声明了一组用于创建一系列产品的方法。
每个方法都对应于某一种产品。
具体工厂(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的具体产品和具体工厂。