工厂管理-抽象工厂模式 精品
三种工厂模式区别

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别.有一个比较好理解的例子,在这跟大家介绍下:1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.具体例子:1.简单工厂:using System;public interface ICar{void run();}public class BMWCar : ICar{public void run(){Console.WriteLine("BMWCar run");}}public class BenzCar : ICar{public void run(){Console.WriteLine("BenzCar run");}}public class Driver{public static ICar DriverCar(string carType){switch (carType){case "BMWCar": return new BMWCar();case "BenzCar": return new BenzCar();default: throw new Exception();}}}public class Client{public static void Main(){ICar myCar = Driver.DriverCar("BenzCar");myCar.run();Console.Read();}}心得:优点是只要实现共有的接口就可以实现不同车跑的方式.但缺点就是要判断哪一种车,造成要修改Driver 类2.工厂方法:using System;public interface ICar{void run();}public class BMWCar : ICar{public void run(){Console.WriteLine("BMWCar run"); }}public class BenzCar : ICar{public void run(){Console.WriteLine("BenzCar run"); }}public abstract class Driver{public abstract ICar DriverCar();}public class BMWDriver : Driver{public override ICar DriverCar(){return new BMWCar();}}public class BenzDriver : Driver{public override ICar DriverCar(){return new BenzCar();}}class Client{public static void Main(){Driver myDriver = new BenzDriver();ICar myCar = myDriver.DriverCar();myCar.run();Console.Read();}}心得:优点是符合了开放-封闭原则(OCP),从整体上还看不出什么缺点.3.抽象工厂:using System;public interface IBusinessCar{void run();}public interface ISportCar{void run();}public class BMWBusinessCar : IBusinessCar{public void run(){Console.WriteLine("BMWCar run");}}public class BenzBusinessCar : IBusinessCar{public void run(){Console.WriteLine("BenzBusinessCar run");}public class BMWSportCar:ISportCar {public void run(){Console.WriteLine("BMWSportCar run"); }}public class BenzSportCar:ISportCar {public void run(){Console.WriteLine("BenzSportCar run"); }}public interface IDriver{IBusinessCar BusinessCarDriver(); ISportCar SportCarDriver();}public class BMWDriver:IDriver{public IBusinessCar BusinessCarDriver() {return new BMWBusinessCar();}public ISportCar SportCarDriver(){return new BMWSportCar();}}public class BenzDriver:IDriverpublic IBusinessCar BusinessCarDriver(){return new BenzBusinessCar();}public ISportCar SportCarDriver(){return new BenzSportCar();}}class Client{public static void Main(){IDriver myDriver =new BenzDriver();ISportCar myCar = myDriver.SportCarDriver();myCar.run();Console.Read();}}心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.。
实验五 工厂方法模式、抽象工厂模式和生成器模式

实验五工厂方法模式、抽象工厂模式和生成器模式的应用一、实验目的通过该实验,理解工厂方法模式、抽象工厂模式和生成器模式的意图、结构,在软件开发中使用这些模式并进行功能验证。
二、实验内容1.手机工厂:现实中不同品牌的手机应由不同的工厂制造,使用工厂方法模式模拟实现。
图1 手机工厂的类图2.微型计算机配件的生产:该系统所需要的产品族有两个:PC系列和MAC系列,产品等级结构也有两个:RAM和CPU,使用抽象工厂模式模拟实现。
图2 微型计算机配件生产系统的设计类图3.用程序画一个小人:要求小人要有头、身体、手和脚。
使用生成器模式模拟实现。
图3 利用程序画小人的类图三、实验步骤与要求1.对于以上题目要认真分析和理解题意,程序中要求使用相应的模式。
2.上机录入,使用JDK编译器调试、运行、验证程序。
3.请指导教师审查程序和运行结果并评定成绩;4.撰写并上交实验报告。
四、实验原理:1、工厂方法模式当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,可以使用工厂方法模式来设计系统。
工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
适合使用工厂方法模式的情景有:●用户需要一个类的子类的实例,但不希望与该类的子类形成耦合●用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。
工厂方法模式的UML类图:图4 工厂方法模式的类图2、抽象工厂模式当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂模式来设计系统。
抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
适合使用抽象工厂模式的情景有:●系统需要为用户提供多个对象,但不希望用户直接使用new运算符实例化这些对象,即希望用户和创建对象的类解耦。
抽象工厂模式的优缺点和适用场景

抽象⼯⼚模式的优缺点和适⽤场景
抽象⼯⼚模式的优点
抽象⼯⼚模式除了具有⼯⼚⽅法模式的优点外,最主要的优点就是可以在类的内部对产品族进⾏约束。
所谓的产品族,⼀般或多或少的都存在⼀定的关联,抽象⼯⼚模式就可以在类内部对产品族的关联关系进⾏定义和描述,⽽不必专门引⼊⼀个新的类来进⾏管理。
抽象⼯⼚模式的缺点
产品族的扩展将是⼀件⼗分费⼒的事情,假如产品族中需要增加⼀个新的产品,则⼏乎所有的⼯⼚类都需要进⾏修改。
所以使⽤抽象⼯⼚模式时,对产品等级结构的划分是⾮常重要的。
适⽤场景
当需要创建的对象是⼀系列相互关联或相互依赖的产品族时,便可以使⽤抽象⼯⼚模式。
说的更明⽩⼀点,就是⼀个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着⼀定的关联或者约束,就可以使⽤抽象⼯⼚模式。
假如各个等级结构中的实现类之间不存在关联或约束,则使⽤多个独⽴的⼯⼚来对产品进⾏创建,则更合适⼀点。
总结
⽆论是简单⼯⼚模式,⼯⼚⽅法模式,还是抽象⼯⼚模式,他们都属于⼯⼚模式,在形式和特点上也是极为相似的,他们的最终⽬的都是为了解耦。
在使⽤时,我们不必去在意这个模式到底⼯⼚⽅法模式还是抽象⼯⼚模式,因为他们之间的演变常常是令⼈琢磨不透的。
经常你会发现,明明使⽤的⼯⼚⽅法模式,当新需求来临,稍加修改,加⼊了⼀个新⽅法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象⼯⼚模式了;⽽对于抽象⼯⼚模式,当减少⼀个⽅法使的提供的产品不再构成产品族之后,它就演变成了⼯⼚⽅法模式。
所以,在使⽤⼯⼚模式时,只需要关⼼降低耦合度的⽬的是否达到了。
简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。
(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。
随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。
当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。
2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。
设计模式就是为了抵御外部需求变化产⽣的。
设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。
)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。
综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。
策略模式简单工厂模式抽象工厂模式

策略模式简单工厂模式抽象工厂模式策略模式、简单工厂模式和抽象工厂模式是常见的设计模式,用于解决不同的问题和满足不同的设计需求。
下面将分别介绍这三种模式,并进行详细的比较。
策略模式策略模式是一种行为型模式,它将一组特定的算法封装成一个独立的类,使得它们可以相互替换。
应用策略模式的主要目的是让算法的变化独立于使用算法的客户端。
策略模式将算法的定义与算法的使用分离开来,这样可以让算法的定义更加灵活,能够根据需要动态地改变。
简单工厂模式简单工厂模式是一种创建型模式,它由一个工厂类负责创建不同类型的对象。
简单工厂模式的核心思想是将对象的创建过程封装起来,客户端只需要通过一个工厂类的方法来获取所需的对象,而不需要了解创建对象的细节。
简单工厂模式常常使用静态方法来创建对象,这样客户端可以直接通过类名来调用工厂方法。
抽象工厂模式也是一种创建型模式,它提供了一种创建一族相关或相互依赖对象的接口,而不需要指定具体的类。
抽象工厂模式的核心思想是将对象的创建过程封装到一个工厂接口中,具体的工厂类实现这个接口来创建不同的对象。
抽象工厂模式可以用于创建一系列的产品对象,这些产品对象有一定的关联关系。
比较1.目的不同:-策略模式的目的是将一组算法封装起来,使得它们可以相互替换。
-简单工厂模式的目的是封装对象的创建过程,使得客户端只需要通过一个工厂类的方法来获取所需的对象。
-抽象工厂模式的目的是提供一种创建一族相关或相互依赖对象的接口。
2.使用场景不同:-策略模式适用于一组特定的算法需要进行动态切换或扩展的场景。
-简单工厂模式适用于需要根据输入参数来决定创建具体对象的场景。
-抽象工厂模式适用于需要创建一系列相关或相互依赖的对象的场景。
3.灵活性不同:-策略模式的算法可以灵活地添加、删除或替换,客户端可以根据需要动态地选择所需的算法。
-简单工厂模式的创建过程在工厂类中,所以客户端只能通过修改工厂类代码来实现创建对象的变化,不够灵活。
工厂管理制度及模式

一、引言工厂作为企业生产的重要场所,其管理制度的制定和实施对于确保生产效率、产品质量、员工福利等方面具有重要意义。
本文将从以下几个方面对工厂管理制度及模式进行探讨,以期为我国工厂管理提供有益的参考。
二、工厂管理制度概述1. 制度目的工厂管理制度旨在规范生产流程,提高生产效率,确保产品质量,保障员工权益,实现企业可持续发展。
2. 制度原则(1)依法治厂:遵循国家法律法规,确保企业合法合规经营。
(2)以人为本:关注员工需求,提高员工福利,激发员工潜能。
(3)精细化管理:注重细节,优化流程,降低成本,提高效益。
(4)持续改进:不断优化管理制度,提高企业竞争力。
三、工厂管理制度内容1. 组织架构(1)明确各部门职责,确保生产、技术、质量、安全、人力资源等各项工作有序进行。
(2)设立生产部、技术部、质量部、安全部、人力资源部等部门,实现分工协作。
2. 生产管理(1)制定生产计划,明确生产目标、进度、质量要求等。
(2)优化生产流程,提高生产效率。
(3)加强生产设备管理,确保设备正常运行。
(4)严格控制生产过程中的质量,确保产品质量。
3. 技术管理(1)引进先进技术,提高产品竞争力。
(2)加强技术研发,提升企业创新能力。
(3)完善技术档案,确保技术资料完整。
4. 质量管理(1)建立质量管理体系,确保产品质量符合国家标准。
(2)加强质量检验,严格控制不合格品流入市场。
(3)实施质量改进,不断提高产品质量。
5. 安全管理(1)建立健全安全管理制度,确保员工生命财产安全。
(2)加强安全教育培训,提高员工安全意识。
(3)定期进行安全检查,排除安全隐患。
6. 人力资源管理(1)制定招聘计划,选拔优秀人才。
(2)加强员工培训,提高员工素质。
(3)完善薪酬福利制度,激发员工积极性。
(4)关注员工心理健康,营造和谐工作氛围。
四、工厂管理模式1. 目标管理(1)明确企业发展战略,制定年度目标。
(2)将目标分解到各部门、各岗位,确保目标实现。
【设计模式-工厂模式】男男女女的抽象工厂模式

【设计模式-⼯⼚模式】男男⼥⼥的抽象⼯⼚模式背景虽然⼥娲已经成功将⼈类创造出来了,可是都是没有性别的,那么后续该如何繁衍呢。
为此,除了增加⼈种外,我们还需要增加所有⼈类都有的⼀个属性:性别。
由此:⼈种和性别相互组合⽣成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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:抽象工厂模式学生姓名张婧学号20XX21077 院系信息科学与技术学院专业计算机应用技术年级20XX 级抽象工厂模式在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。
如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就要用到抽象工厂模式。
抽象工厂模式是简单工厂模式和工厂方法模式的升级版,它有更大的灵活性,同时也更加复杂一些。
为了理解抽象工厂,我们考虑这样一个实际例子:如果你想吃饭了,怎么办自己做吗?自己做就相当于程序中直接使用new。
当然是自己下个指令,别人来做更爽。
那就把做饭的任务交给厨师吧,那么他就是一个做饭的工厂了,你告诉他要吃红烧肉,等会他就从厨房给你端出来一盘香喷喷的红烧肉了,再来个清蒸鱼吧。
下图 1 就是这个问题的模型。
图1显然到了这里,你是Client,厨师就是工厂,他拥有做红烧肉的方法,做清蒸鱼的方法,这些方法返回值就是食物抽象。
红烧肉、清蒸鱼就是食物的继承类,简单工厂模式也成型了。
简单工厂模式结构图2优点:允许客户端相对独立的创建产品的过程,并且在系统引入新产品的时候无需修改客户端。
缺点:对修改不封闭,新增加产品您要修改工厂。
违法了开闭法则(OCP)。
工厂方法模式生活例子:厨师手艺再好,总有不会做的菜,你想吃回锅肉,怎么办,让厨师学呗,于是就给他新增了做回锅肉的方法,以后你再想吃一个新菜,就要给厨师新加一个方法,显然此做法的缺点也就暴露出来了,用程序设计的描述就是对修改永远不能封闭。
面对上面对修改不能封闭的问题,有没有好的解决方案吗?把厨师抽象变成一个基类,你请几个具体的厨师,分别有做清蒸鱼的,做红烧肉的厨师,如果你想吃一个新菜,就再新找个厨师,从你的厨师基类继承一下,让他来做这个新菜。
现在来看这个模式发生了变化,结构中多了一个厨师的抽象,抽象并不具体的加工产品了,至于做什么,是由这个抽象工厂的继承子类来实现,现在的模式也就变成工厂方法模式了,这个上面的结构图1就变成了下面的图3的结构了。
图3现在再来分析现在的模式,显然简单工厂的缺陷解决了,新增加一个菜只需要新增加一个厨师就行了,原来的厨师还在做原来的工作,这样你的设计就对修改封闭了。
工厂方法模式结构图4优点:优化简单工厂模式,做到“开-闭”原则。
可做到把具体的产品创建过程延迟到具体的子类工厂。
缺点:对于创建不同系列的产品无能为力。
抽象工厂模式生活例子你发现菜可分成许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同样是红烧肉由不同菜系出来的味道也各不相同。
如果你的厨师都是鲁菜风味,广东的朋友来了吃不惯,怎么办?现在我们再回到简单工厂模式,我们把红烧肉再向下继承,生成鲁菜红烧肉、粤菜红烧肉、湘菜红烧肉;清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清蒸鱼。
我们也修改一下厨师这个类,不让其返回食物基类,而是返回红烧肉、清蒸鱼、这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜的工作。
图5现在可以看到,想新来做一个菜系,只需新聘请一个厨师就可以了,多么完美,但是你先别高兴太早,如果你想新增加一个菜就变得非常困难了。
抽象工厂模式结构图6抽象工厂模式代码#include <iostream>#include <string>using namespace std;//红烧肉class CHongshaorou{public:virtual ~CHongshaorou() {};//产品使用公共接口virtual void Start() = 0;//抽象基类,纯虚函数由派生类去实现};//鲁菜红烧肉class CHongshaorouLucai : public CHongshaorou{public:CHongshaorouLucai(){cout << "制作鲁菜红烧肉." << endl;}virtual ~CHongshaorouLucai() {};virtual void Start(){cout << "鲁菜红烧肉好了." << endl;};};//粤菜红烧肉class CHongshaorouYuecai : public CHongshaorou {public:CHongshaorouYuecai(){cout << "制作粤菜红烧肉." << endl;}virtual ~CHongshaorouYuecai() {};virtual void Start(){cout << "粤菜红烧肉好了." << endl;};};//清蒸鱼class Cqingzhengyu{public:virtual ~Cqingzhengyu() {};//产品使用公共接口virtual void Start() = 0;//抽象基类,纯虚函数由派生类去实现};//鲁菜清蒸鱼class CqingzhengyuLucai : public Cqingzhengyu{public:CqingzhengyuLucai(){cout << "制作鲁菜清蒸鱼." << endl;}virtual ~CqingzhengyuLucai() {};virtual void Start(){cout << "鲁菜清蒸鱼好了." << endl;};};//粤菜清蒸鱼class CqingzhengyuYuecai : public Cqingzhengyu{public:CqingzhengyuYuecai(){cout << "制作粤菜清蒸鱼." << endl;}virtual ~CqingzhengyuYuecai() {};virtual void Start(){cout << "粤菜清蒸鱼好了." << endl;};};//抽象工厂class CFactory{public:virtual ~CFactory(){};virtual CHongshaorou* CreateHongshaorou() = 0; virtual Cqingzhengyu* Createqingzhengyu() = 0; };//鲁菜工厂class CLucaiFactory : public CFactory{public:CLucaiFactory(){cout << "制作鲁菜工厂." << endl;}virtual ~CLucaiFactory(){};virtual CHongshaorou* CreateHongshaorou(){return new CHongshaorouLucai;};virtual Cqingzhengyu* Createqingzhengyu(){return new CqingzhengyuLucai;};};//粤菜工厂class CYuecaiFactory : public CFactory{public:CYuecaiFactory(){cout << "制作粤菜工厂." << endl;}virtual ~CYuecaiFactory(){};virtual CHongshaorou* CreateHongshaorou(){return new CHongshaorouYuecai;};virtual Cqingzhengyu* Createqingzhengyu(){return new CqingzhengyuYuecai;};};void Test(CFactory* pFactory){CHongshaorou* pHongshaorou = NULL;Cqingzhengyu* pqingzhengyu = NULL;pHongshaorou = pFactory->CreateHongshaorou();//制作红烧肉 pqingzhengyu = pFactory->Createqingzhengyu();//制作清蒸鱼 pHongshaorou->Start();pqingzhengyu->Start();delete pqingzhengyu;delete pHongshaorou;};int main(){CFactory* pFactory = NULL;//抽象工厂//鲁菜工厂。
做红烧肉,清蒸鱼pFactory = new CLucaiFactory;//制作鲁菜工厂Test(pFactory);delete pFactory;cout<<endl;//粤菜工厂。
做红烧肉,清蒸鱼pFactory= new CYuecaiFactory;//制作粤菜工厂Test(pFactory);delete pFactory;system("pause");return 0;}优点:将客户端与具体的类分离。
一个产品系列中的多个对象被设计在一起工作,能保证客户端始终只使用一个产品系列,且有利于更新产品系列。
缺点:难以支持新品种产品。
抽象工厂模式与工厂方法模式的区别a.重点不同。
工厂方法模式强调的是不同的创建者根据自身需求去生产不同的具体产品,重点是生产具体产品;而抽象工厂模式则定位为“在不指定实体类别的前提下,提供了一个可以创建一系列相关或互相依赖之组件的接口”,重点是创建相关组件。
b.工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
c.工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法中生产一个对象);而抽象工厂采用的是对象组合机制,专门定义“工厂”对象来负责对象的创建。
对象组合的方式就是把“工厂”对象作为参数传递。