由浅入深学“工厂模式”
- 格式:doc
- 大小:387.00 KB
- 文档页数:19
数控技术应用专业典型案例——基于“数字化工厂”的人才培养模式实践一、实施背景近年来我校乃至不少兄弟学校数控专业毕业生普遍存在着上岗后不能快速适应现代企业工作岗位的现状,原因可以归结为四个脱节:课程设置与社会需求脱节;传授的知识、技能与企业生产需求脱节;实训教学过程与企业生产过程脱节;教学评价方式与学生能力培养脱节。
这四个“脱节”归根到底就是学生学习内容与岗位工作脱节。
二、主要目标对此,我们专业建设组在“面向社会”的职教理念引领下,以服务为宗旨,以就业为导向,通过理论教学和实践教学融通合一、专业学习和实践学做合一、能力培养和工作岗位对接合一,构建基于“数字化实习工厂”的数控专业工学结合人才培养模式,培养面向生产第一线的能快速适应现代企业工作岗位的技术人才。
三、工作过程在研究和实施过程中,我们摸索出了一套基于“数字化实习工厂”工学结合人才培养四步模式:第一步,创建校园“数字化实习工厂”模拟企业的生产环境;第二步,开发基于“数字化实习工厂”的工学结合人才培养课程;第三步,探索基于“数字化实习工厂”技术范式的教学形式;第四步,打造多领域、复合式的数控专业师资团队。
(一)创建校园“数字化实习工厂”模拟企业的教学环境1.打造一个数字化车间将校内实训工场按照现代企业生产车间格局进行重新规划布局和建设,实现三大管理功能:数控设备的网络化、车间可视化和教学过程的无纸化。
2.构建一个PLM体验中心PLM(产品生命周期管理)体验中心包含PLM体验中心展示厅、数控机床联网、生产管理系统三个部分,可以实现从产品设计、工艺规划、生产测试的全过程体验式学习。
3.建成一个数字化资源库将五大教学资源(教案课件、试题库、教学录像、学生作品、学生信息)进行数字化管理,实现基于网络的信息资源的存储与传递。
(二)开发基于“数字化实习工厂”工学结合的课程体系按照“三针对”原则,基于校园数字化实习工厂模式,采用“倒推法”构建融入职业岗位能力的工学结合课程体系,深入实践浙江省新课程改革的教学理念。
由浅进深教“工厂模式”(1)之阳早格格创做2007-03-25 17:131、传授安排模式中存留的问题我部分迩去对于安排模式中的工厂模式举止了比较深进的教习,通过教习感悟出,当前很多安排模式传道者,正在道述安排模式的历程中存留一些问题,使得安排模式变得很易明白.安排模式自己很抽象,然而是那些传道者正在道述的历程中,将一个抽象的物品道的更抽象,进而使咱们视而却步.有些人正在道述的时间,不思量读者的注意力.比圆我正在瞅《C#安排模式》的时间,正在道述抽象工厂模式的时间,间接便加进了一个示例,而且那个例子比较搀纯,波及了比较多的观念、术语,而且另有算法要处理.然而是那些战要道述的核心真量无关,我念要瞅懂他的示例便要将那个物品皆搞懂,便分别了我的注意力.我部分归纳,教习安排模式的要领是,最先找到一个突破心,比圆不妨先教习构制型模式中简朴的模式,将它明白、流利应用.通过对于一、二个模式有一个深进的认识之后,再教习其余比较搀纯一面的模式便简单多了,那是一种迭代的思维正在教习中的应用.其余教习所有一种安排模式的历程该当是简曲-抽象-再简曲那个的一个历程.那句话的意义是最先通过一个比较简曲一面的例子去帮闲明白安排模式,正在明白之后将您的明白扩展到办理那一类问题,降下到一定的表里下度.而后便是再到简曲,也便是应用安排模式,应用表里办理自己逢到的本量问题.2、教习工厂模式的预备知识:最先声明那些预备知识本去不是工厂模式只是需要,果为我先道述工厂模式,所以正在教习工厂模式之前将那些问题提出.2.1 Upcasting:Upcasting华文翻译有佳几个,比目标上典型变换、进与转型、上溯制型.我部分比较喜欢进与转型那个翻译,即简朴又含意精确.进与转型那个观念,我正在Bruce Eckel的Thinking in c++、Thinking in Java中皆瞅到过,我不是很决定那个观念是可是他提出去的.进与转型是把一个派死类当做它的基类使用.咱们将一个更特殊的典型变换到一个更惯例的典型,那天然是仄安的.派死类是基类的一个超集.它不妨包罗比基类更多的要领,然而它起码包罗了基类的要领.进与转型给咱们戴去的佳处便是咱们不妨将分歧的派死通过一种统一的办法举止处理.进与转型戴去的毛病便是咱们进与转型的历程会拾得派死类的接心.既然有进与转型,也便有背下转型即DownCasting,咱们正在此不搞仔细计划.底下使用一个例子去示例进与转型.public class Base {public void Test() {MessageBox.Show("OK");}}public class Derive:Base {}private void button1_Click(object sender, System.EventArgs e) {Base b=new Derive();b.Test();}2.2 多态我不敢设念离启了多态后的安排模式是一个什么格式.什么是多态,我喜欢归纳那样一句话去回问那个问题,“一个接心,多种真止”.注意那里的接心不然而仅表示Interface关键字,是广义上的接心.正在C#中真止接心咱们有二种道路,一种是借帮继启去真止,一种是借帮Interface去真止.3、工厂安排模式表里3.1 概括工厂模式简曲包罗了简朴工厂、工厂要领、抽象工厂,它们是依照从简朴到搀纯的程序排列的,属于安排模式中的创制型,其中简朴工厂本去不属于GOF的23中模式.然而是它是明白其余的工厂模式的一个很佳的前提,所以很多人正在道述安排模式的时间会提到简朴工厂模式.创制型模式关注的是对于象的创制,创制型模式将创制对于象的历程举止了抽象,也不妨明白为将创制对于象的历程举止了启拆,动做客户步调只是需要去使用对于象,而不再体贴创制对于象历程中的逻辑.3.2 不使用所有模式咱们当前有那样的一个安排,影像家电(VideoWiring)包罗了DVD、VCD.正在基类VideoWiring中有PlayVideo要领,子类沉载了那个要领.咱们怎么样去调用PlayVideo举止播搁呢.咱们不妨瞅到底下的代码不妨真止.底下是调用对于象的要领举止播搁的代码:public abstract class VideoWiring{public abstract string PlayVideo();}public class VCD: VideoWiring{public override string PlayVideo(){return "正正在播搁播搁VCD";}}public class DVD: VideoWiring{public override string PlayVideo(){return "正正在播搁播搁DVD";}}dvd.PlayVideo();那样的语句.private void PlayVideo(){DVD dvd=new DVD();MessageBox.Show(dvd.PlayVideo());VCD vcd=new VCD();MessageBox.Show(VCD.PlayVideo());}上头的代码不妨真止功能然而是短佳,为什么呢?类真止了多态,然而是咱们正在调用的时间并不利用多态.如果咱们有很多的影像家电产品,便需要写很多的类似底下是使用多态完毕播搁功能的代码:private void PlayVideo(){VideoWiring vw;vw=new DVD();Play(vw);vw=new VCD();Play(vw);}private void Play(VideoWiring vw){string str=vw.PlayVideo();MessageBox.Show(str);}无论是什么影像家电产品,咱们皆不妨使用一个统一的办法举止播搁,即vw.PlayVideo().咱们再计划一下,上头的代码存留的问题.虽然上的代码很短,该当不会有问题,然而是咱们定位的目标该当更下些,该当思量何如达到良佳的启拆效验,缩小过得建改的机会.咱们自然的该当思量对于象创制的问题了,能不克不迭让分歧的影像家电产品的创制办法相共,而且那个创制历程对于使用者启拆,也便是道让对于象的创制象播搁功能那样简朴、统一.如果不妨真止,会给咱们的系统戴去更大的可扩展性战尽管少的建改量.“哇!那该多佳呀”.“不要羡慕了,去瞅瞅简朴工厂模式,听道它不妨真止”.3.3 简朴工厂模式咱们使用简朴工厂对于上头的代码继启矫正,根据上头的分解咱们思量对于对于象创制举止近一步的启拆.使用一个类博门去完毕对于对于象创制的启拆,那个类咱们称为工厂,果为它的效率很简朴便死成出一个个的类.底下是一个工厂类的示例代码:public class Create{public static VideoWiring factory(string VideoName){switch(VideoName){case "DVD":return new DVD();case "VCD":return new VCD();}return null;}}那样咱们的客户端代码又不妨越收灵验简净了:注意:正在上头的二段代码示例中咱们便已经使用了进与转型.最先注意正在Create类的factory要领中使用了return new DVD();那样的语句,然而是那个函数的返回值却是VideoWiring,它DVD类的基类.所以咱们的客户步调才不妨使用VideoWiring vw=Create.factory("DVD")那样的语句.那样客户步调本去不体贴创制是怎么样完毕的,以及创制的对于象是什么,咱们皆不妨调用基类统一的接心真止他们的功能.使用UML表示如下图所示:private void PlayVideo(){VideoWiring vw=Create.factory("DVD");vw.PlayVideo();vw=Create.factory("VCD");vw.PlayVideo();}角色证明:工厂类(Creator):根据接易逻辑创制简曲产品,由客户步调间接调用.抽象产品(Product):动做简曲产品的基类,提供统一的接心,也是工厂类要返回的典型.简曲产品(Concrete Product):工厂类真真要创制的典型.上图中只是展示了一个简曲产品,有多个产品的时间类似.底下咱们对于简朴工厂模式举止归纳.使用简朴工厂的佳处是:1、充分利用了多态性不管什么简曲产品皆返回抽象产品.2、充分利用了启拆性,里里产品爆收变更时中部使用者不会受到效率.缺面是:如果减少了新的产品,便必须得建改工厂(Factory).抽象工厂模式不妨背客户端提供一个接心,使得客户端正在不必指定产品的简曲典型的情况下,创制多个产品族中的产品对于象.那便是抽象工厂模式的蓄意咱们将工厂模式推广到普遍的情况,它的类图如下所示:正在有名的OOD的安排准则中有一个喊搞里氏代换准则(Liskov Substitution Principle, LSP).它的真量也便是道进与转型.它的真量是:所有接支女典型的场合,皆应当不妨接支子典型,换句话道如果使用的是一个基类的话,那么一定适用于其子类,而且步调收觉不出基类对于象战子类对于象的辨别.LSP是继启复用的基石,惟有当派死类不妨替换掉基类,硬件的功能不受到效率时,基类才搞真真被复用.3.4 工厂要领有了简朴工厂模式后,已经给咱们戴去了一些佳处,然而是还存留一些问题,如果咱们又多了一个影像家电产品MP4之后,咱们不妨使MP4类从VideoWiring派死,然而是却要建改Create类的代码使它不妨死产出MP4那个产品去.短佳的场合便正在于,咱们屡屡多一个产品的时间皆需要建改Create而不是脆持本去的代码不建改只是举止一种扩展.正在Create类中建改不是屡屡皆简朴的多一个Case语句便不妨办理问题.果为Create类中还启拆了创制对于象的逻辑,有大概还需要建改那些逻辑.那便违犯了里背对于象安排中一个很要害的准则“启-关”准则.“启-关”准则(the Open Closed Principle OCP):正在里背对于象安排中,怎么样通过很小的安排改变便不妨应付于安排需要的变更,那是令安排者极为关注的问题.启关准则便是一个硬件真体正在扩展性圆里该当是启搁的而正在变动性圆里该当是启关的.那个准则道的是,正在安排一个模块的时间,应当使那个模块不妨正在不被建改的前提下被扩展.通过扩展已有的硬件系统,不妨提供新的止为,以谦脚对于硬件的新需要,使变更中的硬件系统有一定的符合性战机动性.已有的硬件模块,特天是最要害的抽象层模块不克不迭再建改,那便使得变更中的硬件系统有一定的宁静性战延绝性.果此正在举止里背对于象安排时要尽管思量接心启拆体制、抽象体制战多态技能.前边安排(简朴工厂)中存留的问题便是它分拆了创制分歧对于象的逻辑,当有新的产品的时间阻挡易扩展.正在启关准则的指挥下咱们思量怎么样沉新建改前边的安排,咱们要尽管使用抽象体制战多态技能.咱们搁弃对于创制分歧对于象的逻辑的启拆,也采与类似产品的办法,抽象出抽象工厂,简曲工厂,简曲工厂从抽象工厂派死,每个简曲工厂中死产一种简曲的产品.“太棒了,报告您,您的那个设念便是工厂要领模式”.底下使用功厂要领模式建改前边的安排:VideoWiring、DVD、VCD三个类的代码战前边的相共,底下咱们瞅瞅正在客户端怎么样使用.public abstract class Create{public abstract VideoWiring factory();}public class DVDCreate: Create{public override VideoWiring factory(){return new DVD();}}public class VCDCreate: Create{public override VideoWiring factory(){return new VCD();}}底下咱们思量需要扩展一个新的产品MP4的时间怎么样处理.private void PlayVideo(){VideoWiring dvd,vcd;Create dvdCreate,vcdCreate;dvdCreate=new DVDCreate();dvd=dvdCreate.factory();Play(dvd);vcdCreate=new VCDCreate();vcd=vcdCreate.factory();Play(vcd);}咱们去瞅瞅减少的代码:public class MP4Create: Create{public override VideoWiring factory() {return new MP4();}}public class MP4: VideoWiring{public override string PlayVideo(){return "正正在播搁MP4";}}咱们再瞅瞅客户端代码:MP4的时间不建改本去的代码,而只是是对于本去的功能举止扩展系统便有了MP4那个产品的功能.private void PlayVideo(){VideoWiring dvd,vcd;Create dvdCreate,vcdCreate;dvdCreate=new DVDCreate();dvd=dvdCreate.factory();Play(dvd);vcdCreate=new VCDCreate();vcd=vcdCreate.factory();Play(vcd);//底下是新删的代码VideoWiring mp4;Create mp4Create;mp4Create=new MP4Create();mp4=mp4Create.factory();Play(mp4);}咱们不妨瞅出使用了工厂要领模式后,很佳的谦脚了启关准则,当咱们减少了一个新的产品将工厂要领模式推广到普遍情况:角色证明:抽象工厂(Creator):定义简曲工厂的接心,所有的创制对于象的工厂类皆必须真止那些接心.简曲工厂(ConcreteCreator):简曲工厂包罗与应用稀切相关的逻辑.搀纯创制简曲的产品.抽象产品(Product):所有产品的基类.简曲产品(ConcreteProduct):真止抽象产品申明的接心.工厂要领模式所创制的每个对于象皆是某个简曲产品的真例.工厂要领模式的蓄意是定义一个创制产品对于象的工厂接心,将本量创制处事推早退子类中.工厂要领模式是简朴工厂模式的进一步抽象战推广.由于使用了多态性,工厂要领模式脆持了简朴工厂模式的便宜,而且克服了它的缺面.正在工厂要领模式中,核心的工厂类不再控制所有的产品的创制,而是将简曲创制的处事接给子类去搞.那个核心类则成为了一个抽象工厂角色,仅控制给出简曲工厂子类必须真止的接心,而不交战哪一个产品类应当被真例化那种细节.那种进一步抽象化的截止,使那种工厂要领模式不妨用去允许系统正在不建改简曲工厂角色的情况下引进新的产品.3.5 抽象工厂模式咱们继启对于影像家电产品的情形举止分解,咱们已经不妨使用功厂要领比较佳的真止了产品的创制,然而是正在往日的分解中咱们并不思量产品种类及死产厂家那样的问题.便拿DVD去道TCL不妨死产、LG也死产等等很多厂家皆死产.DVD是产品种类中的一种,产品种类那个观念正在有些书籍上称为产品族.从其余一个角度去瞅TCL不妨死产DVD、VCD等等很多产品,那些产品正在所有便不妨形成一个产品结构.当咱们思量了那些问题后,提出了二个观念:产品种类、产品结构.咱们正在工厂要领中计划的是一个个简朴的产品的创制,如果咱们对于那个问题举前进一步的钻研、拓展,便该当从简朴的产品过分到多个产品种类,正在工厂要领中咱们思量DVD是一个简朴的产品,当前咱们认为DVD是一个产品种类,有TCL死产的DVD,有LG死产的DVD,VCD是另一个产品种类,有TCL死产的VCD,有LG死产的VCD.便那个问题咱们沉新分解,有二个产品种类分别是DVD、VCD,有二个工厂是TCL战LG,它们分别死产DVD战VCD.咱们使用底下的类图去表示:DVD是抽象类它提供统一的接心,LGDVD、TCLDVD 是二个简曲的类.VCD战DVD类似.有一个抽象的工厂Create,从它派死了二个简曲的类TCLCreate、LGCreate.Create中提供了二个抽象要领factoryDVD战factoryVCD它们提供了二个接心,用于创制DVD产品战VCD产品.正在TCLCreate、LGCreate中真止那二个要领.那样TCLCreate便不妨创制自己的DVD、VCD,共样LGCreate也不妨传经自己的产品.底下是代码结构:public abstract class Create {public abstract DVD factoryDVD();public abstract VCD factoryVCD();}public class LGCreate: Create {public override DVD factoryDVD() {return new LGDVD();}public override VCD factoryVCD() {return new LGVCD();}}public class TCLCreate: Create {public override DVD factoryDVD() {return new TCLDVD();}public override VCD factoryVCD() { return new TCLVCD();}}public abstract class DVD {public abstract string PlayVideo();}public class LGDVD: DVD {public override string PlayVideo() { return "LG的DVD正在播搁";}}public class TCLDVD: DVD {public override string PlayVideo() { return "TCL的DVD正正在播搁"; }}public abstract class VCD {public abstract string PlayVideo();}public class LGVCD: VCD {public override string PlayVideo() {return "LG的VCD正正在播搁";}}public class TCLVCD: VCD {public override string PlayVideo() {return "TCL的VCD正正在播搁";}}客户端使用抽象工厂代码如下:private void button1_Click(object sender, System.EventArgs e) {Create TCL,LG;TCL=new TCLCreate();LG=new LGCreate();PlayDVD(TCL); //输出“TCL的DVD正在播搁”PlayDVD(LG); //输出“LG的DVD正在播搁”}private void PlayDVD(Create create){DVD dvd=create.factoryDVD();MessageBox.Show(dvd.PlayVideo());}底下将抽象工厂模式推广到普遍情况,它的类图如下所示:抽象工厂:提供所有简曲工厂的接心,与应用系统的简曲商业逻辑无关.基础上为每一个产品种类提供一个创制要领.简曲工厂:简曲控制创制产品结构中每个产品.它包罗了创制分歧产品的商业逻辑.它真止抽象工厂中的接心.抽象产品:定义产品的共共接心.简曲产品:是客户需要创制的简曲对于象.正在工厂要领中每个工厂控制创制一个产品,正在抽象工厂中每个工厂创制一系列产品.正在上头举例中使用TCL、LG那样的本量的工厂,正在本量的应用中,往往是咱们根据产品抽象了类,它们主要控制一系列产品的创制,将那些控制抽象工厂的类称为简曲工厂,从那些简曲工厂更进一步举止抽象,抽象出的工厂称为抽象工厂.底下咱们瞅瞅抽象工厂模式的扩展.抽象工厂的扩展包罗了新删一个产品种类及新删一个工厂.当正在现有的抽象产品下增加新的简曲产品时咱们只是需要减少一个新的工厂便不妨.比圆当前有了Haier(海我)的DVD及VCD,咱们很简单便真止扩展,而且也谦脚了“启关准则”.如下图所示:当咱们有了一个新的产品的减少的时间,便不克不迭很佳的谦脚“启关准则”了,果为咱们需要建改每个产出的要领进而是现有的工厂不妨创制出新的产品.比圆咱们减少一个Mp4产品种类.。
设计模式之工厂模式在软件开发中,面对复杂的系统结构和繁琐的代码实现,我们通常都会采用设计模式来提高软件开发的效率和质量。
设计模式是指在某些经典问题上,经过多次实践、总结和抽象出来的一系列通用的解决方案。
其中,工厂模式是比较常见的一种设计模式。
一、什么是工厂模式工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
工厂模式能够在创建对象时把这个过程封装起来,从而使客户端不需要知道具体创建的逻辑。
通俗一点说,就是有一个工厂类,根据不同的需求生产不同的产品。
工厂模式的应用场景比较广泛,例如 JDK 中的 Calendar 和 NumberFormat 类,还有Spring 框架中的 BeanFactory 和 ApplicationContext。
二、工厂模式的分类工厂模式一般分为三种:简单工厂模式、工厂方法模式和抽象工厂模式。
1. 简单工厂模式简单工厂模式又叫静态工厂方法,它是指由一个工厂类负责创建多种类型的对象。
客户端只需要提供必要的参数,由工厂类根据参数来生成相应的对象。
简单工厂模式的优点是生产出的对象在客户端中有些封装,客户端只需要知道自己需要什么产品即可,而不需要知道产品的具体实现细节。
以汽车生产为例来说明简单工厂模式的实现。
我们假设汽车生产线只生产轿车、越野车和卡车三种类型的车辆,我们可以使用简单工厂模式实现这个过程。
首先,定义一个车辆抽象类 Vehicle,包含一个 abstract 方法run,表示车辆运行的方法。
然后,分别定义 Car、SUV 和 Truck三个子类,它们分别实现了 run 方法。
abstract class Vehicle {public abstract void run();}class Car extends Vehicle {public void run() {System.out.println("轿车在高速公路上行驶!");}}class SUV extends Vehicle {public void run() {System.out.println("越野车在山路上行驶!");}}class Truck extends Vehicle {public void run() {System.out.println("卡车在某地工地上拉货!");}}接下来,我们创建一个简单的工厂类 CarFactory,它包含一个静态方法 getVehicle,根据客户端传递的参数来创建不同的类型车辆。
工厂模式和软件手册1、进入方法(1)、正常开机后,先按遥控器上的“-/――”键,使屏幕上显示“―――”;(2)、然后,同时按住前面板上的“菜单(MENU)”键和“待机(STANDBY)”键;(3)、接着,按遥控器上的数字“7”键三次,使屏幕上显示“777”,即启动了工厂模式(现在屏幕上会显示软件版本日期);(4)、再接着,按“菜单”键,出来菜单选项;(5)、最后按“频道+”键,即可进入工厂模式。
进入工厂模式后,按“频道+”或“频道-”键,可选择调试项,按“音量+”或“音量-”键,可进入子菜单或改变该项参数值,按“菜单”键,可逐级退出工厂模式菜单。
在修改某个参数时,子菜单项后会显现“+”号,在确认某个子菜单中各参数被修改完成之后,要记住按“静音”键,让“+”号消逝,只有如此,修改的参数值才会存入到储备器中。
否则,关机后再次开机,所改变的参数值将会复原到修改之前的数值。
2、退出方法按“菜单”键,将菜单切换到初始界面,然后将光标移到“Shipment”项,按“音量-”,即可退出工厂模式。
二、5D66机芯工厂模式数据进入工厂模式,显现的界面如下:White ——白平稳调试子菜单Horizont——行参数调试子菜单Vertical ——场参数调试子菜单Testing ——测试子菜单Shipment ——确认子菜单Design ——E2PROM数据设置子菜单,须密码才能进入1、White子菜单White +CR 32 ——红枪截止电压调整(调剂范畴:0~255)CG 32 ——绿枪截止电压调整(调剂范畴:0~255)CB 32 ——蓝枪截止电压调整(调剂范畴:0~255)WDR 192 ——红枪驱动电压调整(调剂范畴:0~223)WDG 192 ——绿枪驱动电压调整(调剂范畴:0~223)WDB 192 ——蓝枪驱动电压调整(调剂范畴:0~223)SBR 112 ——副亮度调整(调剂范畴:0~149)2、Horizont 子菜单(各参数有效调剂范畴:-64~63)Horizont +Shift -30 ——行中心调整Size 47 ——行幅度调整Trapez 5 ——梯形校正调整Cushion -31 ——枕形校正调整Conner 0 ——边角校正调整(成效不明显,能够不调)Para. 11 ——平行四边形校正调整Sidepin 7 ——弓形校正调整3、Vertical 子菜单(各参数有效调剂范畴:-64~63)Vertical +Shift -14 ——场中心调整Size 1 ——场幅调整C-corr 0 ——场线性校正S-corr 0 ——场S形校正4、Testing 子菜单Picture ——图像模式测试(不用调)Sound ——声音模式测试(不用调)V-Line——帘栅电压调整(水平亮线,调至刚好看不见为止)I2C-Bus ——I2C总线测试(自动检测内部电路IC工作情形)5、Shipment 子菜单Shipment ——确认退出工厂模式菜单在所有参数调试完成后,选择该项,按“音量+”键,则完全退出工厂模式。
对工厂模式的理解工厂模式是一种常用的设计模式,它属于创建型模式,用于封装对象的创建过程。
通过工厂模式,我们可以将对象的创建和使用分离,提高代码的可维护性和扩展性。
在软件开发中,我们经常需要创建不同类型的对象。
如果我们直接在代码中使用new关键字来创建对象,那么代码的可维护性会变差。
当我们需要创建新的对象时,就需要修改已有的代码,违反了开闭原则。
而工厂模式的出现,正是为了解决这个问题。
工厂模式的核心思想是将对象的创建过程封装在一个工厂类中,客户端只需要调用工厂类的方法,即可获取所需的对象。
工厂类根据客户端的请求,选择合适的参数和逻辑来创建对象,并将对象返回给客户端。
工厂模式有三种常见的实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式是最简单的工厂模式,它由一个工厂类负责创建所有的产品对象。
客户端只需要提供一个参数,工厂类根据这个参数来创建相应的对象。
简单工厂模式的优点在于客户端不需要关心对象的创建过程,只需要关心如何使用对象即可。
但是它的缺点也很明显,工厂类负责创建所有的对象,当对象类型较多时,工厂类会变得臃肿,不易于扩展。
工厂方法模式是简单工厂模式的升级版,它将工厂类抽象成接口或抽象类,每个具体的产品对象由专门的工厂类负责创建。
客户端需要使用哪种产品对象,就使用相应的工厂类来创建。
工厂方法模式的优点在于每个工厂类只负责创建特定类型的对象,更符合单一职责原则,代码结构更加清晰。
但是它的缺点在于客户端需要知道每个工厂类的具体实现,不够简洁。
抽象工厂模式是工厂方法模式的进一步扩展,它将多个工厂方法组合到一起,形成一个工厂族,每个工厂负责创建对应的产品族。
客户端通过选择工厂族,即可创建所需的产品对象。
抽象工厂模式的优点在于客户端不需要关心具体的工厂和产品,只需要知道选择哪个工厂族即可。
但是它的缺点在于当需要增加新的产品族时,需要修改抽象工厂的接口,违反了开闭原则。
工厂模式的应用场景非常广泛,特别是在需要创建多种类型的对象时,可以有效地降低代码的耦合度。
工厂模式设计原则
工厂模式是一种创建型设计模式,它主要解决了如何有效地创建对象的问题。
其核心思想是定义一个工厂接口,由具体的工厂类负责创建不同类型的对象。
工厂模式遵循了"开闭原则",通过抽象工厂和具体工厂的分离,使得系统更加灵活可扩展,符合"单一职责原则"。
具体工厂类实现了工厂接口,可以根据客户端的需求创建不同的产品对象。
产品的创建和具体对象的使用分离,客户端不需要知道具体产品类的实现细节,从而降低了类之间的耦合性。
另外,工厂模式经常和其他设计模式相结合,例如抽象工厂模式、单例模式、建造者模式等,可以进一步加强系统的灵活性和可扩展性。
工厂模式的主要优点包括:
1. 实现了对象的创建和使用分离,降低了系统的耦合度。
2. 遵循了"开闭原则",增强了系统的可扩展性和维护性。
3. 可以提供多个具体工厂类,实现不同的功能需求,增强了灵活性。
综上所述,工厂模式在实际开发中具有重要的应用价值,能够有效地降低系统的耦合度,提高系统的可维护性和可扩展性。
⼯⼚设计模式⼯⼚模式的介绍⼯⼚模式(Factory Pattern)是 Java 中最常⽤的设计模式之⼀。
这种类型的设计模式属于创建型模式,它提供了⼀种创建对象的最佳⽅式。
之前我们创建类对象时, 都是使⽤new 对象的形式创建, 除new 对象⽅式以外, ⼯⼚模式也可以创建对象.耦合度: 类与类之间的关系,如果关系⽐较强,⾼耦合, 如果关系⽐较弱,低耦合10个类:10个测试类: 每个测试类都要创建这10个类的对象以前: 在10个测 过new 来创建 10个测试类和这10个类都要关系起来这样耦合度⽐较⾼,⽽开发是要低耦合⼯⼚模式: 定义⼀个⼯⼚类,专门⽤来创建这10个类的对象, 并提供获取的⽅法,那这个时候测试类只需要跟⼯⼚类关联降低低耦合主要解决:主要解决接⼝选择的问题。
何时使⽤:我们明确地计划不同条件下创建不同实例时。
如何解决:让其⼦类实现⼯⼚接⼝,返回的也是⼀个抽象的产品。
关键代码:创建过程在其⼦类执⾏。
应⽤实例: 1、您需要⼀辆汽车,可以直接从⼯⼚⾥⾯提货,⽽不⽤去管这辆汽车是怎么做出来的,以及这个汽车⾥⾯的具体实现。
2、Hibernate 换数据库只需换⽅⾔和驱动就可以。
优点: 1、⼀个调⽤者想创建⼀个对象,只要知道其名称就可以了。
2、扩展性⾼,如果想增加⼀个产品,只要扩展⼀个⼯⼚类就可以。
3、屏蔽产品的具体实现,调⽤者只关⼼产品的接⼝。
缺点:每次增加⼀个产品时,都需要增加⼀个具体类和对象实现⼯⼚,使得系统中类的个数成倍增加,在⼀定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
这并不是什么好事。
使⽤场景: 1、⽇志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,⽤户可以选择记录⽇志到什么地⽅。
2、数据库访问,当⽤户不知道最后系统采⽤哪⼀类数据库,以及数据库可能有变化时。
3、设计⼀个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现⼀个接⼝。
由浅入深学“工厂模式”(1)2007-03-25 17:131、传授设计模式中存在的问题我个人最近对设计模式中的工厂模式进行了比较深入的学习,通过学习感悟出,现在很多设计模式传道者,在讲述设计模式的过程中存在一些问题,使得设计模式变得很难理解。
设计模式本身很抽象,但是这些传道者在讲述的过程中,将一个抽象的东西讲的更抽象,从而使我们望而却步。
有些人在讲述的时候,没有考虑读者的注意力。
比如我在看《C#设计模式》的时候,在讲述抽象工厂模式的时候,直接就进入了一个示例,而且这个例子比较复杂,涉及了比较多的概念、术语,而且还有算法要处理。
但是这些和要讲述的核心内容无关,我想要看懂他的示例就要将这个东西都搞懂,就分散了我的注意力。
我个人总结,学习设计模式的方法是,首先找到一个突破口,比如可以先学习构造型模式中简单的模式,将它理解、熟练应用。
通过对一、两个模式有一个深入的认识之后,再学习其它比较复杂一点的模式就容易多了,这是一种迭代的思想在学习中的应用。
另外学习任何一种设计模式的过程应该是具体-抽象-再具体这个的一个过程。
这句话的意思是首先通过一个比较具体一点的例子来帮助理解设计模式,在理解之后将你的理解扩展到解决这一类问题,上升到一定的理论高度。
然后就是再到具体,也就是应用设计模式,应用理论解决自己遇到的实际问题。
2、学习工厂模式的预备知识:首先声明这些预备知识并不是工厂模式仅仅需要,因为我先讲述工厂模式,所以在学习工厂模式之前将这些问题提出。
2.1 Upcasting:Upcasting中文翻译有好几个,比如向上类型转换、向上转型、上溯造型。
我个人比较喜欢向上转型这个翻译,即简单又含义明确。
向上转型这个概念,我在Bruce Eckel的Thinking in c++、Thinking in Java中都看到过,我不是很确定这个概念是否是他提出来的。
向上转型是把一个派生类当作它的基类使用。
我们将一个更特殊的类型转换到一个更常规的类型,这当然是安全的。
派生类是基类的一个超集。
它可以包含比基类更多的方法,但它至少包含了基类的方法。
向上转型给我们带来的好处就是我们可以将不同的派生通过一种统一的方式进行处理。
向上转型带来的弊端就是我们向上转型的过程会丢失派生类的接口。
既然有向上转型,也就有向下转型即DownCasting,我们在此不做详细讨论。
下面使用一个例子来示例向上转型。
public class Base {public void Test() {MessageBox.Show("OK");}}public class Derive:Base {}private void button1_Click(object sender, System.EventArgs e) {Base b=new Derive();b.Test();}2.2 多态我不敢想象离开了多态后的设计模式是一个什么样子。
什么是多态,我喜欢总结这样一句话来回答这个问题,“一个接口,多种实现”。
注意这里的接口不仅仅表示Interface关键字,是广义上的接口。
在C#中实现接口我们有两种途径,一种是借助继承来实现,一种是借助Interface来实现。
3、工厂设计模式理论3.1 概述工厂模式具体包括了简单工厂、工厂方法、抽象工厂,它们是按照从简单到复杂的顺序排列的,属于设计模式中的创建型,其中简单工厂并不属于GOF 的23中模式。
但是它是理解其它的工厂模式的一个很好的基础,所以很多人在讲述设计模式的时候会提到简单工厂模式。
创建型模式关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。
3.2 不使用任何模式我们现在有这样的一个设计,影像家电(VideoWiring)包括了DVD、VCD。
在基类VideoWiring中有PlayVideo方法,子类重载了这个方法。
我们如何来调用PlayVideo进行播放呢。
我们可以看到下面的代码可以实现。
下面是调用对象的方法进行播放的代码:public abstract class VideoWiring{public abstract string PlayVideo();}public class VCD: VideoWiring{public override string PlayVideo(){return "正在播放播放VCD";}}public class DVD: VideoWiring{public override string PlayVideo(){return "正在播放播放DVD";}}dvd.PlayVideo();这样的语句。
private void PlayVideo(){DVD dvd=new DVD();MessageBox.Show(dvd.PlayVideo());VCD vcd=new VCD();MessageBox.Show(VCD.PlayVideo());}上面的代码可以实现功能但是不好,为什么呢?类实现了多态,但是我们在调用的时候并没有利用多态。
如果我们有很多的影像家电产品,就需要写很多的类似下面是使用多态完成播放功能的代码:private void PlayVideo(){VideoWiring vw;vw=new DVD();Play(vw);vw=new VCD();Play(vw);}private void Play(VideoWiring vw){string str=vw.PlayVideo();MessageBox.Show(str);}无论是什么影像家电产品,我们都可以使用一个统一的方式进行播放,即vw.PlayVideo()。
我们再讨论一下,上面的代码存在的问题。
虽然上的代码很短,应该不会有问题,但是我们定位的目标应该更高些,应该考虑怎样达到良好的封装效果,减少错误修改的机会。
我们自然的应该考虑对象创建的问题了,能不能让不同的影像家电产品的创建方式相同,而且这个创建过程对使用者封装,也就是说让对象的创建象播放功能那样简单、统一。
如果能够实现,会给我们的系统带来更大的可扩展性和尽量少的修改量。
“哇!那该多好呀”。
“不要羡慕了,来看看简单工厂模式,听说它能够实现”。
3.3 简单工厂模式我们使用简单工厂对上面的代码继续改进,根据上面的分析我们考虑对对象创建进行近一步的封装。
使用一个类专门来完成对对象创建的封装,这个类我们称为工厂,因为它的作用很单一就生成出一个个的类。
下面是一个工厂类的示例代码:public class Create{public static VideoWiring factory(string VideoName){switch(VideoName){case "DVD":return new DVD();case "VCD":return new VCD();}return null;}}这样我们的客户端代码又可以更加有效简洁了:注意:在上面的两段代码示例中我们就已经使用了向上转型。
首先注意在Create类的factory方法中使用了return new DVD();这样的语句,但是这个函数的返回值却是VideoWiring,它DVD类的基类。
所以我们的客户程序才可以使用VideoWiring vw=Create.factory("DVD")这样的语句。
这样客户程序并不关心创建是如何完成的,以及创建的对象是什么,我们都可以调用基类统一的接口实现他们的功能。
使用UML表示如下图所示:private void PlayVideo(){VideoWiring vw=Create.factory("DVD");vw.PlayVideo();vw=Create.factory("VCD");vw.PlayVideo();}角色说明:工厂类(Creator):根据业务逻辑创建具体产品,由客户程序直接调用。
抽象产品(Product):作为具体产品的基类,提供统一的接口,也是工厂类要返回的类型。
具体产品(Concrete Product):工厂类真正要创建的类型。
上图中仅仅展示了一个具体产品,有多个产品的时候类似。
下面我们对简单工厂模式进行总结。
使用简单工厂的好处是:1、充分利用了多态性不管什么具体产品都返回抽象产品。
2、充分利用了封装性,内部产品发生变化时外部使用者不会受到影响。
缺点是:如果增加了新的产品,就必须得修改工厂(Factory)。
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。
这就是抽象工厂模式的用意我们将工厂模式推广到一般的情况,它的类图如下所示:在有名的OOD的设计原则中有一个叫做里氏代换原则(Liskov Substitution Principle, LSP)。
它的实质也就是讲向上转型。
它的内容是:任何接收父类型的地方,都应当能够接收子类型,换句话说如果使用的是一个基类的话,那么一定适用于其子类,而且程序察觉不出基类对象和子类对象的区别。
LSP是继承复用的基石,只有当派生类可以替换掉基类,软件的功能不受到影响时,基类才能真正被复用。
3.4 工厂方法有了简单工厂模式后,已经给我们带来了一些好处,但是还存在一些问题,如果我们又多了一个影像家电产品MP4之后,我们可以使MP4类从VideoWiring 派生,但是却要修改Create类的代码使它能够生产出MP4这个产品来。
不好的地方就在于,我们每次多一个产品的时候都需要修改Create而不是保持原来的代码不修改仅仅进行一种扩展。
在Create类中修改不是每次都简单的多一个Case语句就能够解决问题。
因为Create类中还封装了创建对象的逻辑,有可能还需要修改这些逻辑。
这就违反了面向对象设计中一个很重要的原则“开-闭”原则。
“开-闭”原则(the Open Closed Principle OCP):在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。
开闭原则就是一个软件实体在扩展性方面应该是开放的而在更改性方面应该是封闭的。
这个原则说的是,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使得变化中的软件系统有一定的稳定性和延续性。