由浅入深学“工厂模式”
简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。
(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。
随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。
当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。
2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。
设计模式就是为了抵御外部需求变化产⽣的。
设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。
)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。
综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。
由浅入深学“工厂模式”
由浅进深教“工厂模式”(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,根据客户端传递的参数来创建不同的类型车辆。
利用案例教学法由浅入深地讲解抽象工厂模式
#一:
. .
聱
一 … - “
舻 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
利 用 案 例 教 学 法 由浅 入 深地 讲 解 抽 象 工厂 模 式
深入浅出讲解设计模式中的工厂模式幻灯片PPT
计算机工程技术学院
设计模式之--简单工厂模式
追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM 爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或 肯德基,只管向服务员说“来四个鸡翅”就行。麦当劳和肯德 基就是生产鸡翅的Factory。
计算机工程技术学院
设计模式之--简单工厂模式
话说乾隆皇帝酷爱古董文物,大贪官和申当然不会放过这个溜 须拍马的好机会,但是苦于他自己不懂文物,也没有时间亲自 去收集鉴别,所以干脆私下里成立了一个衙门叫做文物管理局, 负责给他收集天下的古董文物。他什么时候想要只需一句话, “来一件XXX”,一件文物就到他手里了。 看出点名堂了吧,我们的和中堂要是在现代可是设计模式高手 哦。这就是简单工厂模式了。 文物管理局就是工厂,青铜器、字画、瓷器都是具体产品,客 户端当然是和申了,他不需要亲自创建这些产品,需要的时候 给工厂招呼一声就是了,虽然他不懂也没有时间去研究这些产 品(当官就是好啊,呵呵)。下面看看代码吧:
计算机工程技术学院
设计模式之--简单工厂模式
client FuitGardener +factory:Fruit
Interface Fruit
+grow:void +harvest:void +plant:void
Grape
+grow:void +harvest:void +plant:void
Seedless:boolen
+Factory: IAntique
瓷器司
水墨司
青铜司
+Factory: IAntique
+Factory: IAntique
+Factory: IAntique
对工厂模式的理解
对工厂模式的理解工厂模式是一种常用的设计模式,它属于创建型模式,用于封装对象的创建过程。
通过工厂模式,我们可以将对象的创建和使用分离,提高代码的可维护性和扩展性。
在软件开发中,我们经常需要创建不同类型的对象。
如果我们直接在代码中使用new关键字来创建对象,那么代码的可维护性会变差。
当我们需要创建新的对象时,就需要修改已有的代码,违反了开闭原则。
而工厂模式的出现,正是为了解决这个问题。
工厂模式的核心思想是将对象的创建过程封装在一个工厂类中,客户端只需要调用工厂类的方法,即可获取所需的对象。
工厂类根据客户端的请求,选择合适的参数和逻辑来创建对象,并将对象返回给客户端。
工厂模式有三种常见的实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式是最简单的工厂模式,它由一个工厂类负责创建所有的产品对象。
客户端只需要提供一个参数,工厂类根据这个参数来创建相应的对象。
简单工厂模式的优点在于客户端不需要关心对象的创建过程,只需要关心如何使用对象即可。
但是它的缺点也很明显,工厂类负责创建所有的对象,当对象类型较多时,工厂类会变得臃肿,不易于扩展。
工厂方法模式是简单工厂模式的升级版,它将工厂类抽象成接口或抽象类,每个具体的产品对象由专门的工厂类负责创建。
客户端需要使用哪种产品对象,就使用相应的工厂类来创建。
工厂方法模式的优点在于每个工厂类只负责创建特定类型的对象,更符合单一职责原则,代码结构更加清晰。
但是它的缺点在于客户端需要知道每个工厂类的具体实现,不够简洁。
抽象工厂模式是工厂方法模式的进一步扩展,它将多个工厂方法组合到一起,形成一个工厂族,每个工厂负责创建对应的产品族。
客户端通过选择工厂族,即可创建所需的产品对象。
抽象工厂模式的优点在于客户端不需要关心具体的工厂和产品,只需要知道选择哪个工厂族即可。
但是它的缺点在于当需要增加新的产品族时,需要修改抽象工厂的接口,违反了开闭原则。
工厂模式的应用场景非常广泛,特别是在需要创建多种类型的对象时,可以有效地降低代码的耦合度。
深度解读模具数控培训之工厂式教学
深度解读模具数控培训之工厂式教学目前,我国正处在数控化、工业化、信息化、市场化、国际化深入发展时期,经济社会结构面临重大转型,工业化正在朝着智能化、自动化方面快速发展,在工业现代化中数控化是工业领域产业发展未来之重点,也是产业发展的必然走势。
这其中CNC数控编程成为了我国工业化最热门的一项技术,因此,数控编程人才成为了近年来最为稀缺的人才。
据近来因为教学成绩突出、教学方式灵活而受到广大学员青睐的卓越模具数控培训介绍,在CNC数控编程学习方面,一般如果基础好,接受能力强的人,是可以选择自学的。
而那些基础不是很好,又没有人指点的人,想要学好CNC数控编程就不那么容易了。
首先,,没有方向,目的不明确,软件板块太多,很难系统地学到技术;其次,遇到问题时没人指点很难解决;最后,学习周期长,很难坚持下去。
所有没有基础的话最好选择一家像深圳卓越数控培训这样专业的培训机构学习。
据了解,深圳卓越数控培训是一家专业从事CNC数控编程,五轴编程、模具设计,产品设计等技术指导与培训。
其教学队伍是由曾在浙江,佛山,深圳大中型企业任职模具设计及CNC数控编程等地有多年工作经验的工程师组建而成,常年招生,滚动开班,并且实行的是小班手把手教学,即不限学时,包教会。
又可以分全日制学习和业余学习,上课时间可根据学员的时间灵活安排,直到学会找到工作为止,这样灵活的教学方式能够以最快的速度培养出一大批优秀的、优质的、能够快速上岗的优秀人才。
据悉,深圳卓越培训CNC数控编程工厂式教学上是有着独特的秘诀的。
据深圳卓越模具数控高级培训透露,要快速学好CNC数控编程必须要经过五个步骤:1、掌握工艺;2、能熟练操作数控机床;3、工装夹具基础;4、学习编程方法技巧;5、必须要有机床实战性学习。
在这五个步骤中,又以第四步学习编程方法技巧最为关键。
深圳卓越模具数控培训负责人介绍,在学习编程方法技巧时,首先,要集中精力打歼灭战,树立目标,在一个较短的时间内集中完成,并及时加以应用,避免进行马拉松式的学习;其次,要对软件功能进行合理的分类,这样不仅可提高记忆效率,而且有助于从整体上把握软件功能的应用;再次,要从一开始就注重培养规范的操作习惯,培养严谨、细致的工作作风,这一点往往比单纯学习技术更为重要;最后,还要将平时所遇到的问题、失误和学习要点记录下来,这种积累的过程就是水平不断提高的过程。
工厂模式原理
工厂模式原理
工厂模式是一种创建型设计模式,用于创建对象的过程。
它将对象的创建细节封装在一个工厂类中,而不是在客户端直接实例化对象。
客户端只需要调用工厂类的方法来获取所需要的对象。
工厂模式包括三个主要组件:
1. 产品接口(Product Interface):定义产品的公共接口,所有具体产品类都必须实现这个接口。
2. 具体产品类(Concrete Product):实现产品接口,定义具体的产品。
3. 工厂类(Factory):负责创建具体产品对象的类。
它包含
一个或多个工厂方法,用于创建不同类型的产品对象。
这些方法通常使用简单工厂方法来创建对象,也可以使用其他创建对象的方式,如工厂方法模式或抽象工厂模式。
工厂模式的主要思想是将具体对象的创建与使用分离,客户端通过工厂类来创建对象,而不需要直接实例化具体的产品类。
这样可以使客户端与具体产品类解耦,使得系统更加灵活,易于扩展。
工厂模式的优点有:
1. 代码组织清晰,符合单一职责原则,每个类只负责一种职责。
2. 客户端与具体产品类解耦,易于替换具体产品类或新增产品类。
3. 强调了面向接口编程,降低了代码的耦合度。
工厂模式适用于以下情况:
1. 客户端不需要知道具体产品类的实现,只需要知道产品接口即可。
2. 客户端无法预知需要创建哪种类型的产品。
3. 系统需要动态地创建对象。
总之,工厂模式通过将对象的创建过程封装在工厂类中,使得客户端与具体产品类解耦,提供了一种灵活、可扩展的方式来创建对象。
它是一种常用的设计模式,被广泛应用于各种软件开发场景中。
factory模式课程设计
factory模式课程设计一、课程目标知识目标:1. 学生能理解工厂模式的基本概念,掌握其在软件开发中的应用。
2. 学生能够描述工厂模式的组成部分,如抽象工厂、具体工厂、抽象产品和具体产品。
3. 学生能够掌握工厂模式的优点,如降低对象间的耦合度,提高代码的可维护性和可扩展性。
技能目标:1. 学生能够运用所学知识,使用工厂模式编写简单的程序实例。
2. 学生能够通过实际案例分析,学会如何将工厂模式应用于实际软件开发中,提高问题解决能力。
情感态度价值观目标:1. 学生通过学习工厂模式,培养对软件工程和设计模式的兴趣,提高对编程的热爱。
2. 学生能够认识到团队合作的重要性,学会与同学共同分析问题、解决问题。
3. 学生能够通过工厂模式的学习,培养良好的编程习惯,提高对代码质量的要求。
分析课程性质、学生特点和教学要求,本课程目标旨在让学生在掌握工厂模式基本知识的基础上,通过实际操作和案例分析,提高编程能力和解决问题的能力。
课程目标具体、可衡量,便于教师进行教学设计和评估,同时激发学生的学习兴趣,培养良好的情感态度价值观。
二、教学内容本课程教学内容紧密围绕课程目标,结合课本第二章“设计模式”相关内容,具体包括以下部分:1. 工厂模式基本概念:介绍工厂模式的定义、作用及其在软件开发中的应用场景。
2. 工厂模式组成部分:讲解抽象工厂、具体工厂、抽象产品和具体产品的概念及关系。
3. 工厂模式分类:介绍简单工厂模式、工厂方法模式和抽象工厂模式三种类型,分析各自的特点和适用场景。
4. 工厂模式优点:阐述工厂模式在降低耦合度、提高代码可维护性和可扩展性等方面的优势。
5. 实例分析:结合实际案例,讲解工厂模式在软件开发中的应用,使学生更好地理解工厂模式的工作原理。
6. 编程实践:引导学生运用所学知识,动手编写工厂模式的实例程序,巩固理论知识。
教学内容安排和进度如下:1. 第1课时:工厂模式基本概念、分类及优点。
2. 第2课时:工厂模式组成部分及实例分析。
工厂模式的心得体会作文
工厂模式的心得体会作文工厂模式是一种常用的软件设计模式,它可以帮助我们更好地组织和创建对象。
通过工厂模式,我们可以将对象的创建逻辑抽离出来,从而实现了对象的解耦和动态生成。
在我学习和应用工厂模式的过程中,我有一些心得体会。
首先,工厂模式的核心思想是将对象的创建和使用分离。
在传统的对象创建过程中,我们通常使用new关键字来直接生成对象,但这种方式会使得代码可读性差、可扩展性差。
而工厂模式通过引入工厂类来负责对象的创建,客户端只需要调用工厂类的方法即可获取所需的对象实例。
这样一来,我们可以更好地组织代码逻辑,易于维护和扩展。
其次,工厂模式可以通过抽象接口实现具体类的隐藏。
在工厂模式中,客户端只与工厂类打交道,而不需要直接与具体的产品类交互。
这样一来,具体产品类的实现细节可以被抽象出来,对客户端而言是透明的。
这种抽象接口的方式可以有效地隐藏具体类的实现细节,提高了代码的可维护性和可扩展性。
再次,工厂模式可以根据不同的需求动态生成对象。
在传统的对象创建方式中,我们需要在客户端明确指定具体的实现类来创建对象,这种方式不够灵活。
而工厂模式通过引入工厂类,可以根据不同的需求动态生成不同的对象。
这样一来,我们可以根据具体的应用场景来选择创建哪个具体的对象,提高了代码的灵活性。
此外,工厂模式可以方便地扩展对象的创建。
在传统的对象创建方式中,如果需要增加一种新的具体实现类,就需要修改客户端的代码来实现对象的创建,这样会导致代码的脆弱性增加。
而工厂模式通过引入工厂类,可以将对象的创建和使用分离,使得增加新的具体实现类变得容易。
只需要扩展工厂类,添加新的产品类型即可,而不需要修改客户端的代码。
这种可扩展性使得工厂模式在软件开发中得到了广泛的应用。
最后,工厂模式适用于复杂对象的创建。
在一些场景下,对象的创建过程非常复杂,可能涉及到多个对象的组合和初始化。
如果使用传统的对象创建方式,这种复杂的创建过程会使得代码变得冗长和难以维护。
工厂模式设计思路
工厂模式设计思路工厂模式设计思路工厂模式是一种常用的设计模式,它可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。
本文将介绍工厂模式的设计思路,包括什么是工厂模式、为什么需要使用工厂模式、工厂模式的实现方式以及在实际开发中如何应用工厂模式。
一、什么是工厂模式?在软件开发中,我们经常会遇到需要创建多个相似对象的情况。
如果每次都手动创建对象,那么会导致代码重复和不易维护。
此时,我们可以使用工厂模式来解决这个问题。
简单来说,工厂模式就是通过一个工厂类来创建对象。
这个工厂类封装了对象的创建过程,并提供了统一的接口来获取对象。
客户端只需要调用这个接口即可获取所需的对象,而不需要关心对象的具体实现方式。
二、为什么需要使用工厂模式?1. 降低代码重复率使用工厂模式可以将对象的创建过程封装在一个独立的类中,避免了在每个地方都手动创建相同类型的对象。
2. 提高代码可维护性如果需要修改某个类的实现方式,只需要修改工厂类即可,而不需要修改所有使用该类的地方。
3. 提高代码可扩展性如果需要新增一个类,只需要在工厂类中添加相应的创建方法即可,而不需要修改其他代码。
三、工厂模式的实现方式1. 简单工厂模式简单工厂模式是最简单的一种工厂模式。
它通过一个工厂类来创建对象,并提供一个静态方法来获取对象。
客户端只需要知道所需对象的类型即可获取对象。
简单工厂模式适用于创建对象比较简单且不会频繁变化的情况。
2. 工厂方法模式工厂方法模式是将对象的创建过程延迟到子类中实现。
它定义了一个抽象工厂类,具体的对象创建由子类实现。
客户端只需要知道所需对象类型对应的具体工厂即可获取对象。
工厂方法模式适用于创建对象比较复杂或者有多个变化维度的情况。
3. 抽象工厂模式抽象工厂模式是一种更加复杂和灵活的工厂模式。
它可以同时创建多个相关或者独立的产品族。
抽象工厂定义了一组接口来创建产品族,具体产品由具体实现类来实现。
抽象工厂模式适用于需要创建多个相关或者独立的产品族的情况。
软件设计模式中的工厂模式
软件设计模式中的工厂模式在软件设计和开发中,模式是一种重要的技术手段,它可以用来解决不同的问题,提高代码的可重用性和可维护性。
工厂模式是一种常用的设计模式,它可以将对象的创建和使用分离开来,使得程序可以更加灵活地处理对象的生成和管理。
本文将介绍工厂模式的相关知识,包括其基本概念、实现方法和应用场景等。
一、基本概念工厂模式是一种创建型模式,其核心思想是将对象的创建过程封装起来,让客户端通过调用工厂类来获取所需的对象。
工厂模式分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
其中,简单工厂模式只有一个工厂类,它根据客户端传递的参数来生成不同的对象;工厂方法模式中,每个对象都有一个对应的工厂类,由客户端决定使用哪个工厂类来创建对象;抽象工厂模式中,一个工厂类可以生成多个产品族的对象,即一组相关的对象。
二、实现方法实现工厂模式需要注意以下几点:1.定义一个工厂接口,用于描述工厂的功能。
2.定义一个工厂类,该类实现工厂接口,并提供一个可以生成对象的方法。
3.定义一个产品接口,用于规范不同类型的产品。
4.定义多个具体产品类,它们都实现产品接口。
5.客户端使用工厂类来生成所需的对象,而不是直接创建对象。
三、应用场景工厂模式适用于以下场景:1.需要大量创建相似对象的情况。
2.需要在不同的环境下生成不同的对象时。
3.需要封装对象的创建过程,提高代码的可维护性和可重用性。
4.需要对客户端隐藏具体的实现细节,从而降低客户端和产品的耦合度。
四、总结工厂模式是一种常用的设计模式,它可以将对象的创建和使用分离开来,使得程序可以更加灵活地处理对象的生成和管理。
工厂模式分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
实现工厂模式需要定义工厂接口、工厂类、产品接口和具体产品类等。
工厂模式适用于需要大量创建相似对象、需要封装对象创建过程或需要隐藏具体实现细节的情况下。
工厂方法模式
工厂方法模式工厂方法模式是一种常用的设计模式,它属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂方法模式中,我们不再由单一的类来决定对象的创建,而是由一个工厂类来负责创建对象。
这样做的好处是,我们可以将对象的创建过程封装起来,使得代码更加灵活,易于扩展和维护。
工厂方法模式的核心思想是定义一个创建对象的接口,但将具体的创建工作延迟到子类中。
这样,客户端代码在不需要知道具体对象的创建细节的情况下,就可以通过工厂方法来创建所需的对象。
在工厂方法模式中,通常会有一个抽象工厂类,它定义了一个创建对象的接口,具体的对象创建工作由其子类来实现。
这样,当需要创建不同类型的对象时,我们只需要使用对应的工厂类即可,而不需要修改客户端代码。
工厂方法模式的优点之一是符合开闭原则,即对扩展开放,对修改关闭。
当需要添加新的产品时,只需要添加一个新的工厂类和对应的产品类,而不需要修改已有的代码。
这样,可以有效地降低系统的耦合度,提高代码的可维护性和可扩展性。
另一个优点是,工厂方法模式可以提供更好的封装性。
客户端代码不需要知道具体的对象创建细节,只需要通过工厂方法来获取所需的对象即可。
这样,可以有效地隐藏对象的创建过程,降低了客户端代码对具体对象的依赖。
除此之外,工厂方法模式还可以提供更好的扩展性。
由于具体对象的创建工作由子类来实现,因此可以根据需要灵活地添加新的工厂类和产品类,而不会对已有的代码产生影响。
这样,可以更好地应对系统的变化和需求的变更。
然而,工厂方法模式也存在一些缺点。
首先,由于每个具体的产品都需要对应一个具体的工厂类,这样就会导致系统中的类的个数增加,可能会导致系统变得更加复杂。
其次,工厂方法模式在一定程度上增加了系统的抽象性和理解难度,可能会增加开发人员的学习成本。
总的来说,工厂方法模式是一种非常实用的设计模式,它可以有效地提高代码的灵活性、可维护性和可扩展性。
在实际的软件开发中,可以根据具体的需求来选择是否采用工厂方法模式,以达到更好的设计效果。
小白必看工业化生产从零开始一步步教你如何打造完美流程
小白必看工业化生产从零开始一步步教你如何打造完美流程工业化生产从零开始一步步教你如何打造完美流程现代工业化生产已成为社会发展的重要支柱之一,而打造一个完美的生产流程则是工业化生产成功的关键。
无论是初次涉足工业化生产还是有经验的从业者,都需要了解并掌握如何从零开始建立一个高效、稳定和优化的生产流程。
本文将为小白们介绍从零开始打造完美生产流程的步骤和要点。
第一步:需求调研与规划在打造完美的生产流程之前,我们首先需要对产品或服务的需求进行深入调研。
这包括市场需求、客户需求、竞争对手分析等。
通过调研,我们能够了解市场的需求状况,将这些需求转化为相应的生产目标。
在需求调研的基础上,我们需要进行全面的规划。
规划包括制定生产目标、确定时间节点、分配资源等。
此外,还需要考虑到生产过程中可能出现的风险和问题,并制定相应的风险应对措施。
只有充分准备和规划,才能确保生产流程的顺利进行。
第二步:原材料采购与供应链管理在建立完整的生产流程之前,我们需要确保原材料供应的稳定性和质量。
这就需要进行原材料的采购和供应链管理。
在采购原材料时,我们需要与供应商建立合作关系,并进行供应商的评估和审核。
同时,要确保原材料符合质量标准,并与供应商签订明确的合同。
供应链管理则需要确保采购、库存、生产和销售环节的协调和流畅。
第三步:建立生产流程在完成前两步准备工作之后,我们开始着手建立生产流程。
首先,我们需要制定详细的操作规程和作业指导书,明确每个环节的具体操作步骤和要求。
这有助于统一员工的操作标准,提高生产的效率和一致性。
其次,要确定生产过程中所需的设备和工具,并进行设备的选型和采购。
同时,要制定设备的维护保养计划,确保设备的正常运转。
此外,要合理布局生产车间,确保生产过程中的流线型和物料流的顺畅。
并建立相应的质量控制和监控机制,及时检测和纠正可能存在的问题。
第四步:优化与改进在建立生产流程后,我们需要不断地进行优化与改进。
首先,要搜集生产数据,并进行分析和评估。
工厂模式学习报告ppt课件
}
else
{
throw new BadFruitException("Bad fruit request");
}
}
}
整理版课件
12
简单工厂模式的结构
工厂类(Creator)角色:担任这个 角色的是工厂方法模式的核心, 含有与应用紧密相关的商业逻 辑.具体由一个JAVA类实现.
•抽象产品(Product)角色:一般 是所有公共产品的公共拥有的 接口.可以是接口也可以是抽象 类.
整理版课件
22
public interface Creator {
public abstract Connection
设计模式的实际应用 getConnection(); ConnectionFactory static newInsttic newInstance()
•具体产品(Concrete Product) 角色:工厂模式所创建的任何对 象都是这个角色.具体由一个 JAVA类实现.
Fruit Gardener
factory(String which)
整理版课件
fruit Applet等
13
简单工厂模式的实现
•多层次的产品结构 •使用JAVA接口或JAVA抽象类 •多个工厂方法(可以有多个工厂方法)
“设计模式”学习报告
移动互联子公司 胡凯 2003-08-07
整理版课件
1
概要:
•模式概论 •简单工厂模式 •工厂模式 •设计模式的实际应用 •总结 •相关资源
整理版课件
2
▪模式概论
什么是模式 为什么要用模式 设计模式的分类
整理版课件
3
什么是模式 ?
深入浅出设计模式(中文版)
看过了前两个模式, 对这个模式各个角色之间的协调情况应该心里有个数了, 我就不举 具体的例子了。只是一定要注意满足使用抽象工厂模式的条件哦。
单例模式
一、引子 单例模式是设计模式中使用很频繁的一种模式, 在各种开源框架、 应用系统中多有应用, 在我前面的几篇文章中也结合其它模式使用到了单例模式。 这里我们就单例模式进行系统的 学习。并对有人提出的“单例模式是邪恶的”这个观点进行了一定的分析。 二、定义与结构 单例模式又叫做单态模式或者单件模式。在 GOF 书中给出的定义为:保证一个类仅有 一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来代表那些本质上 具有唯一性的系统组件(或者叫做资源) 。比如文件系统、资源管理器等等。 单例模式的目的就是要控制特定的类只产生一个对象, 当然也允许在一定情况下灵活的 改变对象的个数。 那么怎么来实现单例模式呢?一个类的对象的产生是由类构造函数来完成 的,如果想限制对象的产生,一个办法就是将构造函数变为私有的(至少是受保护的) ,使 得外面的类不能通过引用来产生对象; 同时为了保证类的可用性, 就必须提供一个自己的对 象以及访问这个对象的静态方法。 现在对单例模式有了大概的了解了吧, 其实单例模式在实现上是非常简单的——只有一 个角色,而客户则通过调用类方法来得到类的对象。 放上一个类图吧,这样更直观一些:
public class Magnate{ public static void main(String[] args){ try{ //告诉司机我今天坐奔驰 Car car = Driver.driverCar("benz"); //下命令:开车 car.drive(); 。 。 。 将本程序空缺的其他信息填充完整后即可运行。如果你将所有的类放在一个文件中,请 不要忘记只能有一个类被声明为 public。本程序在 jdk1.4 下运行通过。 程序中各个类的关系表达如下:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
由浅入深学“工厂模式”(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):在面向对象设计中,如何通过很小的设计改变就可以应对设计需求的变化,这是令设计者极为关注的问题。
开闭原则就是一个软件实体在扩展性方面应该是开放的而在更改性方面应该是封闭的。
这个原则说的是,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使得变化中的软件系统有一定的稳定性和延续性。