三种工厂模式区别
简单工厂模式、工厂模式和抽象工厂模式区别及优缺点
简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。
(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。
随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。
当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。
2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。
设计模式就是为了抵御外部需求变化产⽣的。
设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。
)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。
综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。
策略模式简单工厂模式抽象工厂模式
策略模式简单工厂模式抽象工厂模式策略模式、简单工厂模式和抽象工厂模式是常见的设计模式,用于解决不同的问题和满足不同的设计需求。
下面将分别介绍这三种模式,并进行详细的比较。
策略模式策略模式是一种行为型模式,它将一组特定的算法封装成一个独立的类,使得它们可以相互替换。
应用策略模式的主要目的是让算法的变化独立于使用算法的客户端。
策略模式将算法的定义与算法的使用分离开来,这样可以让算法的定义更加灵活,能够根据需要动态地改变。
简单工厂模式简单工厂模式是一种创建型模式,它由一个工厂类负责创建不同类型的对象。
简单工厂模式的核心思想是将对象的创建过程封装起来,客户端只需要通过一个工厂类的方法来获取所需的对象,而不需要了解创建对象的细节。
简单工厂模式常常使用静态方法来创建对象,这样客户端可以直接通过类名来调用工厂方法。
抽象工厂模式也是一种创建型模式,它提供了一种创建一族相关或相互依赖对象的接口,而不需要指定具体的类。
抽象工厂模式的核心思想是将对象的创建过程封装到一个工厂接口中,具体的工厂类实现这个接口来创建不同的对象。
抽象工厂模式可以用于创建一系列的产品对象,这些产品对象有一定的关联关系。
比较1.目的不同:-策略模式的目的是将一组算法封装起来,使得它们可以相互替换。
-简单工厂模式的目的是封装对象的创建过程,使得客户端只需要通过一个工厂类的方法来获取所需的对象。
-抽象工厂模式的目的是提供一种创建一族相关或相互依赖对象的接口。
2.使用场景不同:-策略模式适用于一组特定的算法需要进行动态切换或扩展的场景。
-简单工厂模式适用于需要根据输入参数来决定创建具体对象的场景。
-抽象工厂模式适用于需要创建一系列相关或相互依赖的对象的场景。
3.灵活性不同:-策略模式的算法可以灵活地添加、删除或替换,客户端可以根据需要动态地选择所需的算法。
-简单工厂模式的创建过程在工厂类中,所以客户端只能通过修改工厂类代码来实现创建对象的变化,不够灵活。
工厂模式分类
⼯⼚模式分类
⼯⼚模式实现了创建者和调⽤者分离,⼯⼚模式分为简单⼯⼚、⼯⼚⽅法、抽象⼯⼚模式。
⼯⼚模式好处
⼯⼚模式是我们最常⽤的实例化对象模式了,是⽤⼯⼚⽅法代替new操作的⼀种模式。
利⽤⼯⼚模式可以降低程序的耦合性,为后期的维护修改提供了很⼤的便利。
将选择实现类、创建对象统⼀管理和控制。
从⽽将调⽤者跟我们的实现类解耦。
简单⼯⼚模式
简单⼯⼚设计模式相当于是⼀个⼯⼚中有各种不同的产品,创建在⼀个类中,调⽤者⽆需知道具体产品的名称,只需要知道产品类所对应的参数即可。
但是⼯⼚的职责过重,⽽且当类型过多时不利于系统的扩展维护。
(⽐如:汽车⼚不管什么牌⼦的汽车都创造,利⽤简单⼯⼚模式实现,我需要⼀辆车⼦)。
分别创造⽐亚迪和哈佛汽车
简单⼯⼚模式应⽤场景
优点:⼯⼚类含有必要的判断逻辑,调⽤者给出信息后通过⼯⼚类来决定在什么时候创建哪⼀个产品类的实例,客户端可以免除直接创建产品对象的责任,⽽仅仅“消费”产品;简单⼯⼚模式通过这种做法实现了对责任的分割,它提供了专门的⼯⼚类⽤于创建对象,有利于整个软件体系结构的优化。
缺点:由于⼯⼚类集中了所有实例的创建逻辑,违反了⾼内聚责任分配原则,将全部创建逻辑集中到了⼀个⼯⼚类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变⼯⼚类了。
当系统中的具体产品类不断增多时候,可能会出现要求⼯⼚类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在⼀起,很难避免模块功能的蔓延,对系统的维护和扩展⾮常不利;
⼯⼚⽅法:。
代工模式OEM OBM ODM CMT
代工模式OEM OBM ODM CMT
oem是指托厂商按原厂之需求与授权,依特定的条件而生产。
obm即代工厂经营自有
品牌。
odm指原始设计制造商。
cmt全称是cutting, making, trimming指来料加工。
1、odm是英语original design manufacturer的缩写,直译是“原始设计制造商”。
odm是指某制造商设计出某产品后,在某些情况下可能会被另外一些企业看中,要求配上
后者的品牌名称来进行生产,或者稍微修改一下设计来生产。
其中,承接设计制造业务的
制造商被称为odm厂商,其生产出来的产品就是odm产品。
2、oem生产,也称作定点生产,又称代工(生产),基本含义为品牌生产者不轻易生产产品,而是利用自己掌控的关键的核心技术负责管理设计和研发新产品,掌控销售渠道。
3、obm即代工厂经营自有品牌,由于代工厂做obm要有完善的营销网络作支撑,渠道建设的费用很大,花费的精力也远比做oem和odm高,而且常会与自己oem、odm客户有
所冲突。
通常为保证大客户利益,代工厂很少大张旗鼓地去做obm。
4、cmt全称就是cutting, making, trimming指来料加工.即为由进口商提供更多一
定的原材料、半成品、零部件、元器材, 有时候也可以提供更多有关的设备与技术,由出
口方加工企业根据进口商的建议展开加工加装,成品缴外商销售,出口方缴纳加工费的一种
贸易方式。
简单工厂模式,工厂方法模式和抽象工厂模式的异同
简单工厂模式,工厂方法模式和抽象工厂模式的异同简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。
我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。
用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。
一.特点简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
它又称为静态工厂方法模式。
它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
在这个模式中,工厂类是整个模式的关键所在。
它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。
有利于整个软件体系结构的优化。
工厂方法模式:工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。
提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。
首先完全实现‘开-闭原则’,实现了可扩展。
其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式是对简单工厂模式进行了抽象。
有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。
在这个模式中,工厂类和产品类往往可以依次对应。
即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
设计模式(简单工厂,工厂方法,抽象工厂)区别
第一种表述简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。
其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。
本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。
简单工厂简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
工厂方法工厂方法是针对每一种产品提供一个工厂类。
通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
抽象工厂抽象工厂是应对产品族概念的。
比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结★工厂模式中,重要的是工厂类,而不是产品类。
产品类可以是多种形式,多层继承或者是单个类都是可以的。
但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别简单工厂:用来生产同一等级结构中的任意产品。
(对于增加新的产品,无能为力)工厂模式:用来生产同一等级结构中的固定产品。
(支持增加任意产品)抽象工厂:用来生产不同产品族的全部产品。
(对于增加新的产品,无能为力;支持增加产品族)以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。
所以要根据情况考虑应该使用哪种方法。
第二种表述简单工厂、工厂方法和抽象工厂都是创建型的设计模式。
三者的共同点是:1、都有两种作用不同的类:产品类和工厂类。
其中,工厂类在自己的方法中实例化产品类(即使用new命令生成产品类的对象),并将生成的产品类的对象提供给外部使用。
2、创建的过程,都是类似的:工厂类得到一个标志(可以由程序输入,也可以读取配置文件中的内容),返回一个产品对象。
设计模式之工厂模式(3种)详解及代码示例
设计模式之⼯⼚模式(3种)详解及代码⽰例 ⼯⼚模式划分来说总共有三类:简单⼯⼚模式、⼯⼚⽅法模式和抽象⼯⼚模式。
其中简单⼯⼚模式不输⼊23种设计模式之⼀,但他们⼜都属于创建型模式。
我们依次讲解这三种⼯⼚模式。
⼀、简单⼯⼚ 1、什么是简单⼯⼚模式? ⾸先来说简单⼯⼚,简单⼯⼚模式,⼜叫做静态⼯⼚模式(Static Factory Method),由⼀个⼯⼚对象决定创建出哪⼀种产品类的实例,简单⼯⼚模式的实质是由⼀个⼯⼚类根据传⼊的参数,动态决定应该创建哪⼀个产品类。
属于创建型模式,但不属于GOF23设计模式。
2、简单⼯⼚适⽤场景 ⼯⼚类负责创建的对象⽐较少;客户端(应⽤层)只需要知道传⼊⼯⼚类的参数,对于如何创建对象(逻辑)不关⼼。
3、简单⼯⼚优缺点优点:只需要传⼊⼀个正确的参数,就可以获取你所需要的对象,⽽⽆需知道其细节创建。
缺点:⼯⼚类的职责相对过重,增加新的产品,需要修改⼯⼚类的判断逻辑,违背了开闭原则。
4、简单⼯⼚实现 ⾸先来看类图: 代码实现:public class ShapeFactory {public Shape getShape(String shapeType){if(shapeType.equalsIgnoreCase("circle")){return new Circle();}else if(shapeType.equalsIgnoreCase("rectangle")){return new Rectangle();}else if(shapeType.equalsIgnoreCase("squere")){return new Squere();}return null;}public Shape getShape(Class clazz) throws Exception{return (Shape) clazz.newInstance();}}⼆、⼯⼚⽅法模式 1、什么是⼯⼚⽅法 ⼯⼚⽅法模式(Factory Method),⼜称多态性⼯⼚模式,属于设计模式三⼤分类中的创建型模式,作为抽象⼯⼚模式的孪⽣兄弟,⼯⼚⽅法模式定义了⼀个创建对象的接⼝,但由⼦类决定要实例化的类是哪⼀个,也就是说⼯⼚模式让实例化推迟到⼦类。
软件设计模式(总结归纳)
1. 工厂模式和抽象工厂模式相同点:在两种工厂模式在被使用的时候都能产生具体的产品类,比直接创建对象更加灵活!不同点:工厂模式只有一个抽象产品类,而抽象工厂模式可以有多个!工厂模式的具体工厂类只能创建一个具体类的实例,而抽象工厂模式则可以创建多个!2.抽象工厂模式和建造者模式相同点:都能生产出具体的产品类不同点:抽象工厂模式是定义一个创建对象的接口,让子类决定实现哪一个类,抽象工厂使其子类延迟到其子类,其本身是没有状态的。
建造者模式是将一个复杂对象的创建与他的表示分离,使同样的构造过程可以创建不同的表示,其是有状态的,比抽象工厂更加灵活(比较之下,抽象工厂处于更加具体的尺度上,而建造者模式处于更加宏观的尺度上)!3.类适配器和对象适配器对象适配器:不是通过继承的方式,而是通过对象组合的方式来进行处理的,我们只要学过OO的设计原则的都知道,组合相比继承是推荐的方式。
类适配器:通过继承的方式来实现,将旧系统的方法进行封装。
对象适配器在进行适配器之间的转换过程中,无疑类适配器也能完成,但是依赖性会加大,并且随着适配要求的灵活性,可能通过继承膨胀的难以控制。
【一般来说类适配器的灵活性较差,对象适配器较灵活,是我们推荐的方式,可以通过依赖注入的方式,或者是配置的方式来做。
类适配器需要继承自要适配的旧系统的类,无疑这不是一个好的办法。
】4.装饰,组合和责任链模式装饰模式是一个链型的组织关系,而组合模式是一个集合的组织关系,也就是说组合模式必须有一个类是组合的容器,它包含了所有组合模式中的功能类,而装饰模式任何一个类都是链上的一个节点而已。
但是这里装饰模式和组合模式没有优劣之分,只是适合的场景不一样,模式本身就是没有优劣之分,只是各自适合不同的场景。
而在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。
请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
智慧工厂建设的三种模式
目前,由于各个行业生产流程不同,加上各个行业智能化情况不同,智慧工厂建设离不开三个模式。
第一种模式是从生产过程数字化到智慧工厂。
在石化、钢铁、冶金、建材、纺织、造纸、医药、食品等流程制造领域,企业发展智能制造的内在动力在于产品品质可控,侧重从生产数字化建设起步,基于品控需求从产品末端控制向全流程控制转变。
因此其智慧工厂建设模式为:一是推进生产过程数字化,在生产制造、过程管理等单个环节信息化系统建设的基础上,构建覆盖全流程的动态透明可追溯体系,基于统一的可视化平台实现产品生产全过程跨部门协同控制。
二是推进生产管理一体化,搭建企业 CPS 系统,深化生产制造与运营管理、采购销售等核心业务系统集成,促进企业内部资源和信息的整合和共享。
三是推进供应链协同化,基于原材料采购和配送需求,将 CPS 系统拓展至供应商和物流企业,横向集成供应商和物料配送协同资源和网络,实现外部原材料供应和内部生产配送的系统化、流程化,提高工厂内外供应链运行效率。
四是整体打造大数据化智慧工厂,推进端到端集成,开展个性化定制业务。
第二种模式是从智能制造生产单元(装备和产品) 到智慧工厂。
在机械、汽车、航空、船舶、轻工、家用电器和电子信息等离散制造领域,企业发展智能制造的核心目的是拓展产品价值空间,侧重从单台设备自动化和产品智能化入手,基于生产效率和产品效能的提升实现价值增长。
因此其智慧工厂建设模式为:一是推进生产设备(生产线)智能化,通过引进各类符合生产所需的智能装备,建立基于 CPS 系统的车间级智能生产单元,提高精准制造、敏捷制造能力。
二是拓展基于产品智能化的增值服务,利用产品的智能装置实现与 CPS 系统的互联互通,支持产品的远程故障诊断和实时诊断等服务。
三是推进车间级与企业级系统集成,实现生产和经营的无缝集成和上下游企业间的信息共享,开展基于横向价值网络的协同创新。
四是推进生产与服务的集成,基于智慧工厂实现服务化转型,提高产业效率和核心竞争力。
工厂模式的三种形式
⼯⼚模式的三种形式简单⼯⼚模式-Simple Factory Patter在简单⼯⼚模式结构图中包含如下⼏个⾓⾊:● Factory(⼯⼚⾓⾊):⼯⼚⾓⾊即⼯⼚类,它是简单⼯⼚模式的核⼼,负责实现创建所有产品实例的内部逻辑;⼯⼚类可以被外界直接调⽤,创建所需的产品对象;在⼯⼚类中提供了静态的⼯⼚⽅法factoryMethod(),它的返回类型为抽象产品类型Product。
● Product(抽象产品⾓⾊):它是⼯⼚类所创建的所有对象的⽗类,封装了各种产品对象的公有⽅法,它的引⼊将提⾼系统的灵活性,使得在⼯⼚类中只需定义⼀个通⽤的⼯⼚⽅法,因为所有创建的具体产品对象都是其⼦类对象。
● ConcreteProduct(具体产品⾓⾊):它是简单⼯⼚模式的创建⽬标,所有被创建的对象都充当这个⾓⾊的某个具体类的实例。
每⼀个具体产品⾓⾊都继承了抽象产品⾓⾊,需要实现在抽象产品中声明的抽象⽅法。
⼯⼚⽅法模式-Factory Method Pattern● Product(抽象产品):它是定义产品的接⼝,是⼯⼚⽅法模式所创建对象的超类型,也就是产品对象的公共⽗类。
● ConcreteProduct(具体产品):它实现了抽象产品接⼝,某种类型的具体产品由专门的具体⼯⼚创建,具体⼯⼚和具体产品之间⼀⼀对应。
● Factory(抽象⼯⼚):在抽象⼯⼚类中,声明了⼯⼚⽅法(Factory Method),⽤于返回⼀个产品。
抽象⼯⼚是⼯⼚⽅法模式的核⼼,所有创建对象的⼯⼚类都必须实现该接⼝。
● ConcreteFactory(具体⼯⼚):它是抽象⼯⼚类的⼦类,实现了抽象⼯⼚中定义的⼯⼚⽅法,并可由客户端调⽤,返回⼀个具体产品类的实例。
与简单⼯⼚模式相⽐,⼯⼚⽅法模式最重要的区别是引⼊了抽象⼯⼚⾓⾊,抽象⼯⼚可以是接⼝,也可以是抽象类或者具体类抽象⼯⼚模式-Abstract Factory Pattern● AbstractFactory(抽象⼯⼚):它声明了⼀组⽤于创建⼀族产品的⽅法,每⼀个⽅法对应⼀种产品。
工厂模式的三种类型
工厂模式的三种类型工厂模式的三种类型:1抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。
抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。
1.抽象化工厂(creator)角色抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
2.具体内容工厂(concretecreator)角色具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
3.抽象化(product)角色抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体内容产品(concreteproduct)角色抽象化模式所建立的具体内容实例对象总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。
2工厂方法模式同样属类的建立型模式又被表示为多态工厂模式。
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
1.抽象化工厂(creator)角色工厂方法模式的核心,任何工厂类都必须实现这个接口。
2.具体内容工厂(concretecreator)角色具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
3.抽象化(product)角色工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体内容产品(concreteproduct)角色工厂方法模式所建立的具体内容实例对象工厂方法模式与简单工厂模式在结构上的不同不是很明显。
工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
工厂方法模式之所以存有一个别名为多态性工厂模式是因为具体内容工厂类都存有共同的USB,或者存有共同的抽象化父类。
工厂设计模式(三种)详解
⼯⼚设计模式(三种)详解什么是⼯⼚设计模式?⼯⼚设计模式,顾名思义,就是⽤来⽣产对象的,在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地⽅都需要修改⼀遍,这显然违背了软件设计的开闭原则,如果我们使⽤⼯⼚来⽣产对象,我们就只和⼯⼚打交道就可以了,彻底和对象解耦,如果要更换对象,直接在⼯⼚⾥更换该对象即可,达到了与对象解耦的⽬的;所以说,⼯⼚模式最⼤的优点就是:解耦本篇主要介绍三种⼯⼚设计模式的使⽤:1、简单⼯⼚2、⼯⼚⽅法3、抽象⼯⼚简单⼯⼚设计模式定义:⼀个⼯⼚⽅法,依据传⼊的参数,⽣成对应的产品对象;⾓⾊:1、抽象产品2、具体产品3、具体⼯⼚4、产品使⽤者使⽤说明:先将产品类抽象出来,⽐如,苹果和梨都属于⽔果,抽象出来⼀个⽔果类Fruit,苹果和梨就是具体的产品类,然后创建⼀个⽔果⼯⼚,分别⽤来创建苹果和梨;代码如下:⽔果接⼝public interface Fruit {void whatIm();}具体类苹果public class Apple implements Fruit {@Overridepublic void whatIm() {//苹果}}具体类梨public class Pear implements Fruit {@Overridepublic void whatIm() {//梨}}具体⼯⼚⽔果⼯⼚public class FruitFactory {public Fruit createFruit(String type) {if (type.equals("apple")) {//⽣产苹果return new Apple();} else if (type.equals("pear")) {//⽣产梨return new Pear();}return null;}}产品使⽤FruitFactory mFactory = new FruitFactory();Apple apple = (Apple) mFactory.createFruit("apple");//获得苹果Pear pear = (Pear) mFactory.createFruit("pear");//获得梨就这样,⼀个⾮常简单的⼯⼚设计模式就完成了,但是有没有发现什么问题呢?对,那就是如果我想吃⾹蕉,想吃橘⼦呢,我万⼀什么都想吃呢??所以,以上的这种⽅式,每当我想添加⼀种⽔果,就必然要修改⼯⼚类,这显然违反了开闭原则,亦不可取;所以简单⼯⼚只适合于产品对象较少,且产品固定的需求,对于产品变化⽆常的需求来说显然不合适;所以我们来看下⼀种⽅式;⼯⼚⽅法设计模式定义:将⼯⼚提取成⼀个接⼝或抽象类,具体⽣产什么产品由⼦类决定;⾓⾊:抽象产品类具体产品类抽象⼯⼚类具体⼯⼚类使⽤说明:和上例中⼀样,产品类抽象出来,这次我们把⼯⼚类也抽象出来,⽣产什么样的产品由⼦类来决定;代码如下:⽔果接⼝苹果类和梨类代码和上例⼀样⼯⼚接⼝public interface FruitFactory {Fruit createFruit();//⽣产⽔果}苹果⼯⼚public class AppleFactory implements FruitFactory {@Overridepublic Fruit createFruit() {return new Apple();}}梨⼯⼚public class PearFactory implements FruitFactory {@Overridepublic Fruit createFruit() {return new Pear();}}使⽤AppleFactory appleFactory = new AppleFactory();PearFactory pearFactory = new PearFactory();Apple apple = (Apple) appleFactory.createFruit();//获得苹果Pear pear = (Pear) pearFactory.createFruit();//获得梨以上这种⽅式,虽然解耦了,也遵循了开闭原则,但是问题根本还是没有解决啊,换汤没换药,如果我需要的产品很多的话,需要创建⾮常多的⼯⼚,所以这种⽅式的缺点也很明显;抽象⼯⼚设计模式定义:为创建⼀组相关或者是相互依赖的对象提供的⼀个接⼝,⽽不需要指定它们的具体类。
Java中三种工厂设计模式的区别解析
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。
但是在一些情况下, new操作符直接生成对象会带来一些问题。
举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。
在这些情况,新对象的建立就是一个“过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。
模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢?解决方案:建立一个工厂来创建对象实现:一、引言1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。
2)简单工厂模式:后来出现工业革命。
用户不用去创建宝马车。
因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。
比如想要320i系列车。
工厂就创建这个系列的车。
即工厂可以创建产品。
3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。
于是由单独分出来多个具体的工厂。
每个具体工厂创建一种系列。
即具体工厂类只能创建一个具体产品。
但是宝马工厂还是个抽象。
你需要指定某个具体的工厂才能生产车出来。
4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。
于是这个工厂开始生产宝马车和需要的空调。
最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。
而不用自己去创建523i空调车宝马车.这就是工厂模式。
二、分类工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
工厂模式可以分为三类:1)简单工厂模式(Simple Factory)2)工厂方法模式(Factory Method)3)抽象工厂模式(Abstract Factory)这三种模式从上到下逐步抽象,并且更具一般性。
工厂模式的常见应用场景
工厂模式的常见应用场景一、什么是工厂模式工厂模式(Factory Pattern)是一种常用的设计模式,属于创建型模式的一种。
在软件开发中,经常需要创建对象,而不同的对象可能需要不同的创建方式,如果每次都直接使用new关键字来创建对象,会导致代码的耦合性较高。
工厂模式通过定义一个创建对象的接口,让子类决定实例化哪个类,从而将对象的创建和使用分离,降低耦合性。
工厂模式主要包含三种形式:1.简单工厂模式:由一个工厂类根据传入的参数决定创建哪一种产品类的对象。
2.工厂方法模式:定义一个创建对象的接口,由子类决定实例化哪一个类。
3.抽象工厂模式:提供一个创建一系列相关或依赖对象的接口。
二、工厂模式的优点1.降低了代码的耦合性:将对象的创建和使用分离,客户端只需要知道工厂类的接口,而不需要知道具体的实现类。
2.提高了代码的可扩展性:如果需要增加新的产品类,只需要增加一个对应的工厂类即可,不需要修改原有的代码。
3.符合开闭原则:对扩展开放,对修改关闭。
4.遵循了单一职责原则:每个工厂类只负责创建相应的产品,不关心其他类的逻辑。
三、工厂模式的应用场景1. 数据库连接在开发中,经常需要使用数据库连接来操作数据库。
根据不同的数据库类型(MySQL、Oracle等),连接参数、驱动类等都有所不同。
这时可以使用工厂模式来创建数据库连接对象,根据不同的数据库类型返回不同的连接对象。
// 数据库连接工厂接口public interface ConnectionFactory {Connection createConnection();}// MySQL数据库连接工厂public class MySqlConnectionFactory implements ConnectionFactory { public Connection createConnection() {// 创建MySQL数据库连接对象}}// Oracle数据库连接工厂public class OracleConnectionFactory implements ConnectionFactory { public Connection createConnection() {// 创建Oracle数据库连接对象}}2. 日志记录器在软件开发中,经常需要记录系统的日志信息,如日志的格式、存储方式等都可能不同。
简单工厂模式的介绍、优缺点分析和解决方案
简单⼯⼚模式的介绍、优缺点分析和解决⽅案所有的模式都是利⽤java中的封装、继承、多态这三个特性张开的,就像由这三个秘籍组成的各种变幻万千的招式,⽽所有的⽬的都是为了打败坏模式带来的代码垃圾这个敌⼈,所有的招式都是要求“可维护”、“可扩展”、“可复⽤”,当然如果达到这三个标准后,基本上“灵活性好”同时也就拥有了。
所以下⾯介绍最常⽤的⼯⼚模式,分为三类:简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式。
⼀、简单⼯⼚模式1.介绍⼯⼚模式,顾名思义,最少有⼀个⽣产产品的机器存在的⼯⼚Factory,与此同时,也要有⼀个构建好的产品模块Product。
所以,我们要⽤到Factory来创造Product。
在简单⼯⼚模式中,有⼏种⾓⾊存在。
⼀个是所有产品的⽗类P,即所有产品的模板;另外⼀个是继承了⽗类P 的产品⼦类p1,p2...;当然,最重要的是Factory,在Factory中可以将这些的产品实例化,根据需求来将Factory和Product产⽣联系。
2.例⼦我们先来做⼀个例⼦吧,以做⼀个简单的计算器来开始。
a. Product的⽗类: Operationpublic class Operation {private double _numberA = 0 ;private double _numberB = 0;private double result = 0;public double get_numberA() {return _numberA;}public void set_numberA(double _numberA) {this._numberA = _numberA;}public double get_numberB() {return _numberB;}public void set_numberB(double _numberB) {this._numberB = _numberB;}public double getResult() {return result;}public void setResult(double result) {this.result = result;}}b.继承了Product的⼦类:加法产品(OperationAdd),乘法产品(OperationMul),减法产品(OperationSub),除法产品(OperationDiv)public class OperationAdd extends Operation{@Overridepublic double getResult(){double result = 0;result = get_numberA() + get_numberB();return result;}}public class OperationSub extends Operation{@Overridepublic double getResult(){double result = 0 ;result = get_numberA() - get_numberB();return result;}}public class OperationMul extends Operation {@Overridepublic double getResult(){double result = 0;result = get_numberA()*get_numberB();return result;}}public class OperationDiv extends Operation{@Overridepublic double getResult(){double result = 0 ;if(get_numberB() == 0){throw new RuntimeException("除数不能为0.");}else{result = get_numberA()/get_numberB();return result;}}}c.⽣产产品的⼯⼚Factory(OperationFactory)package SimpleFactory;public class OperationFactory {public static Operation createOperation(String operate){Operation oper = null;switch(operate){case "+" :oper = new OperationAdd() ;break;case "-" :oper = new OperationSub() ;break;case "*" :oper = new OperationMul() ;break;case "/" :oper = new OperationDiv() ;break;}return oper;}}最后我们把⼯⼚和产品做好以后就可以,将产品买给客户啦。
几种生产模式的区别
几种生产模式的区别1. 批量生产批量生产是一种常见的生产模式,在此模式下,公司会集中生产大量相同或类似产品。
这种生产模式适用于需求量稳定且预测容易的产品。
批量生产的主要优点是效率高、成本低。
由于生产规模大,公司可以享受到规模经济的优势,从而降低单位产品的生产成本。
然而,批量生产模式也存在一些缺点。
由于产品种类较少,因此灵活性较低,不适用于需求变化频繁的市场。
另外,批量生产的周期较长,从设计到生产再到交付需要较长时间,不利于快速响应市场需求。
2. 定制生产定制生产是指根据客户的个性化需求,生产量小、产品差异大的生产模式。
这种模式适用于市场需求变化快速,消费者追求个性化的产品。
与批量生产相比,定制生产的优点是可以满足个性化需求,提供独特的产品体验。
然而,定制生产也存在一些挑战。
由于生产规模小,单位产品的生产成本较高。
此外,定制生产需要与客户充分沟通,确保理解客户需求并满足其期望,这对企业的销售和服务团队提出了更高的要求。
3. 大规模定制生产大规模定制生产是批量生产和定制生产的结合。
在此模式下,公司会利用先进的生产技术和信息系统,根据客户个性化的需求定制产品,但在生产过程中仍能享受规模经济的优势。
这种生产模式可以提供个性化的产品,同时也能降低单位产品的生产成本。
大规模定制生产模式的主要挑战在于生产过程的复杂性。
由于需要生产多种个性化的产品,企业需要具备强大的生产和供应链管理能力,以确保高效运作和交付。
4. 智能化生产随着人工智能和物联网技术的发展,智能化生产模式正在逐渐兴起。
在智能化生产中,传感器、机器人和数据分析等技术被广泛应用于生产过程中,以提高效率、降低成本并实现自动化。
智能化生产模式可以提供更高的生产速度、更精确的品质控制和更低的人力成本。
然而,智能化生产也面临一些挑战。
首先,智能化生产的技术成本较高,对企业的投资能力有一定要求。
其次,由于生产过程较为复杂,企业需要具备相应的技术和人才来支持和维护智能化生产系统。
三种工厂模式详解
三种⼯⼚模式详解我的相关博⽂:1. 简单⼯⼚模式,⼀图就看尽涉及:产品抽象类(即⽔果类) 、⼯⼚类、具体产品类(⾹蕉类、苹果类)2.⼯⼚⽅法模式使⽤先来看⼀下,上截图:⼯⼚⽅法模式的实现:3 class SingleCore // 抽象类,抽象的处理器类。
具体产品的基类4 {5 public:6 virtual void Show() = 0;7 };8 class SingleCoreA:public SingleCore // 具体型号的处理器A 具体的产品类9 {10 public:11 void Show()12 {13 cout << "单核处理器 A型" << endl;14 }15 };16 class SingleCoreB:public SingleCore // 具体型号的处理器B 具体的产品类17 {18 public:19 void Show()20 {21 cout << "单核处理器 B型" << endl;22 }23 };24 class Factory // 抽象类,⼯⼚类具体⼯⼚的基类25 {26 public:27 virtual SingleCore* CreateSingleCore() = 0;28 };29 class FactoryA:public Factory // 具体的⼯⼚类⼚⼦130 {31 public:32 SingleCore* CreateSingleCore()33 {34 cout << "Create SingleCore A" << endl;35 return new SingleCoreA(); // ⼚⼦1⽣产A型CPU36 }37 };38 class FactoryB:public Factory // 具体的⼯⼚类⼚⼦239 {40 public:41 SingleCore* CreateSingleCore()42 {43 cout << "Create SingleCore B" << endl;44 return new SingleCoreB(); //⼚⼦2⽣产B型CPU45 }46 };⼩结:前者是简单⼯⼚模式、后者是⼯⼚⽅法模式。
分析工厂模式三层架构的认识和分析
分析工厂模式三层架构的认识和分析我们所认识的三层架构,其实就是将整个业务应用划分为表示层、业务逻辑层、数据访问层。
三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。
这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。
普通三层:数据访问层DAL:用于实现与数据库的交互和访问,从数据库获取数据或保存数据到数据库的部分。
业务逻辑层BLL:业务逻辑层承上启下,用于对上下交互的数据进行逻辑处理,实现业务目标。
表示层UI:主要实现和用户的交互,接收用户请求或返回用户请求的数据结果的展现,而具体的数据处理则交给业务逻辑层和数据访问层去处理。
业务实体Model:用于封装实体类数据结构,一般用于映射数据库的数据表或视图,用以描述业务中客观存在的对象。
Model分离出来是为了更好地解耦,为了更好地发挥分层的作用,更好地进行复用和扩展,增强灵活性。
通用类库Common:通用的辅助工具类。
三层架构三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了"高内聚,低耦合"的思想。
1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增、删、改、查。
在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。
微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或成为领域层)、表示层。
三层结构原理3个层次中,系统主要功能和业务逻辑都在业务逻辑层进行处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别.
有一个比较好理解的例子,在这跟大家介绍下:
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:IDriver
public 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();
}
}
心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.。