三种工厂模式区别

合集下载

简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式区别及优缺点各位⼩伙伴好,今天给⼤家主要介绍⼀下简单⼯⼚模式、⼯⼚模式和抽象⼯⼚模式的区别及各⾃的优缺点。

(本⽂实现语⾔为Python3)【前⾔】众所周知今天所讲的内容是设计模式的⼀类;对于设计模式这个概念,我想⾸先请⼤家问问⾃⼰:1、什么是设计模式 2、我们为什么要了解并学习设计模式?从我上学的时候我相信⼤家跟我⼀样也接触过设计模式的课程,当时可能懵懵懂懂只是知其然,当时还会想明明可以直接写出来为什么要搞成这样的形式,我就算学会了它到底什么时候能⽤呢?⼀系列的问题...Emm算了到时候再想想(lazy)。

随着实践的不断增多,现在我想可以对这些问题有个初步的回答了: 1、在我看来,设计模式外在看是经过前⼈不断实践总结出的针对某些指定场景极其好⽤的⼀种代码结构设计模板;内在看其实是⼀种设计思想(即为什么他们会这么想,这样想较之其他⽅法有什么好处)。

当我们真正的理解设计思想的时候,就可能会在⾯对问题和场景时⾃然⽽然的灵活运⽤到多种设计模式,⽽不是单⼀的刻板结构。

2、在⼯程化的开发中,需求往往是会不断变化的,这也是让很多开发⼈员及其烦躁的地⽅,所以才会有开发与产品的亲密关系。

设计模式就是为了抵御外部需求变化产⽣的。

设计模式应符合开闭原则(类、模块和函数等应该对扩展开放,对修改关闭。

)⼀个好的设计在之后的开发中,包括发⽣重⼤需求变化的时候,往往代码只需要进⾏简单重构去进⾏适配,⽽不是通过打补丁的⽅式去堆砌,也很容易避免破窗效应,充分的发挥了灵活的扩展和适配,⼤⼤增强了维护性。

综上所述,我们了解并学习设计模式,可以使我们的代码变得更加健壮、结构清晰,可以从容、灵活的适配需求变更(可复⽤、可扩展、可维护、够灵活)【正⽂】⾸先,这三种模式解决的问题是实例化对象的问题;那么为什么不直接实例化⽽⽤这样的⼯⼚形式去实例化对象呢?因为【待实例化对象太多(⼦类多且变动、调⽤频繁)或者实例化对象的过程、准备⽐较复杂】,直接实例化意味着每次都⽤重复的去执⾏实例化这个操作,如果有很多待实例化的操作,那么就要重复执⾏很多次,更不要说万⼀在实例化之前还要执⾏⼀堆配置项的初始化。

策略模式简单工厂模式抽象工厂模式

策略模式简单工厂模式抽象工厂模式

策略模式简单工厂模式抽象工厂模式策略模式、简单工厂模式和抽象工厂模式是常见的设计模式,用于解决不同的问题和满足不同的设计需求。

下面将分别介绍这三种模式,并进行详细的比较。

策略模式策略模式是一种行为型模式,它将一组特定的算法封装成一个独立的类,使得它们可以相互替换。

应用策略模式的主要目的是让算法的变化独立于使用算法的客户端。

策略模式将算法的定义与算法的使用分离开来,这样可以让算法的定义更加灵活,能够根据需要动态地改变。

简单工厂模式简单工厂模式是一种创建型模式,它由一个工厂类负责创建不同类型的对象。

简单工厂模式的核心思想是将对象的创建过程封装起来,客户端只需要通过一个工厂类的方法来获取所需的对象,而不需要了解创建对象的细节。

简单工厂模式常常使用静态方法来创建对象,这样客户端可以直接通过类名来调用工厂方法。

抽象工厂模式也是一种创建型模式,它提供了一种创建一族相关或相互依赖对象的接口,而不需要指定具体的类。

抽象工厂模式的核心思想是将对象的创建过程封装到一个工厂接口中,具体的工厂类实现这个接口来创建不同的对象。

抽象工厂模式可以用于创建一系列的产品对象,这些产品对象有一定的关联关系。

比较1.目的不同:-策略模式的目的是将一组算法封装起来,使得它们可以相互替换。

-简单工厂模式的目的是封装对象的创建过程,使得客户端只需要通过一个工厂类的方法来获取所需的对象。

-抽象工厂模式的目的是提供一种创建一族相关或相互依赖对象的接口。

2.使用场景不同:-策略模式适用于一组特定的算法需要进行动态切换或扩展的场景。

-简单工厂模式适用于需要根据输入参数来决定创建具体对象的场景。

-抽象工厂模式适用于需要创建一系列相关或相互依赖的对象的场景。

3.灵活性不同:-策略模式的算法可以灵活地添加、删除或替换,客户端可以根据需要动态地选择所需的算法。

-简单工厂模式的创建过程在工厂类中,所以客户端只能通过修改工厂类代码来实现创建对象的变化,不够灵活。

工厂模式分类

工厂模式分类

⼯⼚模式分类
⼯⼚模式实现了创建者和调⽤者分离,⼯⼚模式分为简单⼯⼚、⼯⼚⽅法、抽象⼯⼚模式。

⼯⼚模式好处
⼯⼚模式是我们最常⽤的实例化对象模式了,是⽤⼯⼚⽅法代替new操作的⼀种模式。

利⽤⼯⼚模式可以降低程序的耦合性,为后期的维护修改提供了很⼤的便利。

将选择实现类、创建对象统⼀管理和控制。

从⽽将调⽤者跟我们的实现类解耦。

简单⼯⼚模式
简单⼯⼚设计模式相当于是⼀个⼯⼚中有各种不同的产品,创建在⼀个类中,调⽤者⽆需知道具体产品的名称,只需要知道产品类所对应的参数即可。

但是⼯⼚的职责过重,⽽且当类型过多时不利于系统的扩展维护。

(⽐如:汽车⼚不管什么牌⼦的汽车都创造,利⽤简单⼯⼚模式实现,我需要⼀辆车⼦)。

分别创造⽐亚迪和哈佛汽车
简单⼯⼚模式应⽤场景
 优点:⼯⼚类含有必要的判断逻辑,调⽤者给出信息后通过⼯⼚类来决定在什么时候创建哪⼀个产品类的实例,客户端可以免除直接创建产品对象的责任,⽽仅仅“消费”产品;简单⼯⼚模式通过这种做法实现了对责任的分割,它提供了专门的⼯⼚类⽤于创建对象,有利于整个软件体系结构的优化。

缺点:由于⼯⼚类集中了所有实例的创建逻辑,违反了⾼内聚责任分配原则,将全部创建逻辑集中到了⼀个⼯⼚类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变⼯⼚类了。

当系统中的具体产品类不断增多时候,可能会出现要求⼯⼚类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在⼀起,很难避免模块功能的蔓延,对系统的维护和扩展⾮常不利;
⼯⼚⽅法:。

代工模式OEM OBM ODM CMT

代工模式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种)详解及代码示例

设计模式之⼯⼚模式(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.装饰,组合和责任链模式装饰模式是一个链型的组织关系,而组合模式是一个集合的组织关系,也就是说组合模式必须有一个类是组合的容器,它包含了所有组合模式中的功能类,而装饰模式任何一个类都是链上的一个节点而已。

但是这里装饰模式和组合模式没有优劣之分,只是适合的场景不一样,模式本身就是没有优劣之分,只是各自适合不同的场景。

而在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。

请求在这个链上传递,直到链上的某一个对象决定处理此请求。

发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();
}
}
心得:抽象方法似乎达到了完美境界.把开奔驰的司机和开宝马的司机的公共方法抽象出来,并对不同的司机创建不同的类,到时候不管是开什么车的司机随你添加.它们唯一的共同点都是开车.。

相关文档
最新文档