设计模式(简单工厂,工厂方法,抽象工厂)区别

合集下载

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

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

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

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

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

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

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

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

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

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

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

工厂模式分类

工厂模式分类

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

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

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

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

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

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

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

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

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

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

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

面向对象23种设计模式

面向对象23种设计模式

面向对象23种设计模式面向对象23种设计模式在面向对象的编程中,设计模式是一种解决问题的通用方案。

设计模式可以帮助开发人员在开发过程中减少代码的冗余和复杂性,并提高代码的可维护性和可重用性。

本文将介绍23种面向对象的设计模式。

1. 工厂方法模式工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是让子类决定实例化哪个类。

在工厂方法模式中,客户端不需要知道具体的创建逻辑,只需要知道工厂类中定义的接口即可。

2. 抽象工厂模式抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定它们的具体类。

在抽象工厂模式中,客户端不需要知道具体的创建逻辑,只需要知道工厂类中定义的接口即可。

3. 单例模式单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个访问该实例的全局点。

4. 原型模式原型模式是一种创建型设计模式,它允许复制或克隆一个现有的对象,而不必知道其具体实现。

5. 建造者模式建造者模式是一种创建型设计模式,它允许逐步创建复杂的对象,而不必知道其内部实现细节。

6. 适配器模式适配器模式是一种结构型设计模式,它将一个或多个不兼容的类或接口转换为客户端所需的接口。

7. 桥接模式桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离开来,以便独立地进行修改。

8. 组合模式组合模式是一种结构型设计模式,它将一组对象作为单个对象处理,以便客户端可以以相同的方式处理单个对象和组合对象。

9. 装饰器模式装饰器模式是一种结构型设计模式,它允许向现有对象添加额外的功能,同时不改变其现有的结构。

10. 外观模式外观模式是一种结构型设计模式,它为一组复杂的子系统提供了一个统一的接口,以便于客户端使用。

11. 享元模式享元模式是一种结构型设计模式,它利用共享技术来最小化内存使用,以及提高应用程序的性能。

12. 代理模式代理模式是一种结构型设计模式,它提供了一个代理对象,使得客户端可以通过代理对象间接地访问实际对象。

工厂业务逻辑

工厂业务逻辑

工厂业务逻辑
工厂模式是一种设计模式,它在软件开发中的“业务逻辑”主要体现在对象创建的过程中。

在复杂的系统中,通常会有多个类可以实现同一接口或者继承自同一个抽象类,具体使用哪个类来实例化对象需要根据运行时的条件决定。

这时,我们可以定义一个工厂类(或方法)来封装这个创建过程,隐藏了创建逻辑的复杂性,并使得代码更加灵活、易于扩展和维护。

以工厂业务逻辑为例:
1. 简单工厂模式:
- 定义一个工厂类,提供一个静态方法(或实例方法),接收参数并根据参数返回不同的产品实例。

- 例如,有一个`AnimalFactory`,通过传入字符串类型参数如"dog"或"cat",返回对应的`Dog`或`Cat`对象实例。

2. 工厂方法模式:
- 定义一个抽象工厂类,其中声明一个创建产品的抽象方法,由其子类来实现具体的创建逻辑。

- 如有`AnimalFactory`抽象类,其中包含`createAnimal()`抽象方法,然后分别创建`DogFactory`和`CatFactory`子类,它们各自重写`createAnimal()`方法,返回相应的`Dog`或`Cat`对象实例。

3. 抽象工厂模式:
- 提供一个接口用于创建相关或依赖对象家族的多个对象,而无需指定具体的产品类。

- 假设存在不同类型的动物及其对应的食物,可以创建一个`PetFactory`抽象工厂,它能生产出某一特定种类的宠物及其专属食物。

工厂模式的业务逻辑就是围绕如何根据需求动态选择和创建合适对象来进行组织和设计,从而降低耦合度,提高代码的灵活性和可扩展性。

简单工厂工厂方法抽象工厂策略模式策略与工厂的区别

简单工厂工厂方法抽象工厂策略模式策略与工厂的区别

简单工厂工厂方法抽象工厂策略模式策略与工厂的区别简单工厂、工厂方法、抽象工厂以及策略模式在软件开发中都是常用的设计模式,它们都是为了解决不同对象的创建和使用问题。

下面将对它们进行详细的介绍,并比较它们之间的区别。

1. 简单工厂模式(Simple Factory Pattern):简单工厂模式是由一个工厂类根据传入的参数决定创建哪种产品的设计模式。

它包含三个角色:工厂类负责创建产品,产品类定义产品的具体实现,客户端通过工厂类获取产品对象。

简单工厂模式将对象的创建与使用进行了分离,增加了灵活性,但是违反了开闭原则,因为每次新增产品都需要修改工厂类。

2. 工厂方法模式(Factory Method Pattern):工厂方法模式是指定义一个创建产品对象的接口,但是由子类决定实例化哪个类。

这样可以将产品的实例化延迟到子类中进行,满足了开闭原则。

工厂方法模式由抽象工厂类、具体工厂类和抽象产品类、具体产品类组成。

具体工厂类负责创建具体产品类的实例,抽象产品类定义了产品的接口。

客户端通过抽象工厂类获取产品对象。

工厂方法模式解决了简单工厂模式的缺点,但是增加了类的个数。

3. 抽象工厂模式(Abstract Factory Pattern):抽象工厂模式是指提供一个创建一系列相关或互相依赖对象的接口,而无需指定具体的类。

抽象工厂模式由抽象工厂类、具体工厂类和抽象产品类、具体产品类组成。

抽象工厂类定义了创建产品的接口,具体工厂类负责创建具体产品。

抽象产品类定义了产品的接口,具体产品类实现了产品的具体实现。

客户端通过抽象工厂类获取产品对象。

抽象工厂模式提供了一种创建一系列产品对象的方法,但是增加新产品时需要修改所有的工厂类。

4. 策略模式(Strategy Pattern):策略模式是指定义了一系列的算法,并将每个算法封装起来,使得它们可以互相替换,使得算法的选择和使用可以独立于客户端。

策略模式由抽象策略类、具体策略类和环境类组成。

简单工厂模式,工厂方法模式和抽象工厂模式的异同

简单工厂模式,工厂方法模式和抽象工厂模式的异同

简单工厂模式,工厂方法模式和抽象工厂模式的异同简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类。

我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。

用这三种设计模式都可以实现,那究竟这三种设计模式有什么异同呢?下面根据这三者之间的特点,优点,缺点,适用范围进行比较。

一.特点简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

它又称为静态工厂方法模式。

它的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

在这个模式中,工厂类是整个模式的关键所在。

它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。

有利于整个软件体系结构的优化。

工厂方法模式:工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。

提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。

首先完全实现‘开-闭原则’,实现了可扩展。

其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂方法模式是对简单工厂模式进行了抽象。

有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。

在这个模式中,工厂类和产品类往往可以依次对应。

即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

设计模式-创建型模式的优缺点比较

设计模式-创建型模式的优缺点比较

比较几种创建型模式的优缺点,仔细考察这几种模式的区别和相关性。

第一类是工厂模式,工厂模式专门负责将大量有共同接口的类实例化。

工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。

工厂模式有三种形态:简单工厂模式;工厂方法模式;抽象工厂模式是。

前两者是类的创建模式,后者是对象的创建模式。

简单工厂:简单工厂模式是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及工厂角色(Creator)、抽象产品(Product)角色及具体产品(Concrete Product)角色等三个角色。

优点:模式的核心是工厂类,该类中含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。

简单工厂模式实现了对责任的分割。

缺点:当产品类有复杂的多层次等级结构时,工厂类只有它自己。

模式中工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类。

将多个创建逻辑放在一个类中,当产品类有不同接口种类时,工厂类需要判断在什么时候创建某种产品,使得系统在将来进行功能扩展时较为困难。

该模式采用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。

简单工厂模式只在有限的程度上符合“开-闭”原则。

工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

Factory Method使一个类的实例化延迟到其子类。

工厂方法模式是简单工厂模式的进一步抽象和推广,其基本思想是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

优点:多态性:客户代码可以做到与特定应用无关,适用于任何实体类子类可以重写新的实现,也可以继承父类的实现。

加一层间接性,增加了灵活性。

良好的封装性,代码结构清晰。

扩展性好,在增加产品类的情况下,只需要适当修改具体的工厂类或扩展一个工厂类,就可“拥抱变化”屏蔽产品类。

产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。

23种设计模式的经典运用

23种设计模式的经典运用

23种设计模式的经典运用介绍设计模式是解决软件设计中常见问题的可重复使用的解决方案。

本文将介绍23种经典的设计模式,并给出它们在实际开发中的应用示例。

通过学习这些设计模式,您将增加对软件设计的理解,并能够更好地解决问题。

创建型设计模式1.工厂方法模式(F a c t o r y M e t h o d)工厂方法模式通过定义一个创建对象的接口,但由子类决定实例化具体类。

这种方法可以延迟实例化过程,具有更高的灵活性和可扩展性。

应用场景:-在一个系统中,希望客户端与具体类的实例化解耦。

-希望通过增加具体类的扩展来增加系统的灵活性。

2.抽象工厂模式(A b s t r a c t F a c t o r y)抽象工厂模式提供一个接口,用于创建相关或依赖对象组。

这种模式将对象的实例化推迟到子类中,从而实现了解耦。

应用场景:-当一个系统独立于其产品的创建、组合和表示时。

-当需要一个系列的相互依赖的对象而无需指定其具体类时。

3.单例模式(S i n gl e t o n)单例模式确保一个类只有一个实例,并提供一个全局访问点。

这种模式常用于控制对资源的访问,例如数据库连接或日志文件。

应用场景:-当需要一个类的唯一实例,并且该实例需要被多个客户端共享时。

-当需要限制系统中特定类的实例数量时。

4.原型模式(P r o to t y p e)原型模式通过复制现有对象来创建新对象。

这种模式对于创建需要消耗大量资源的对象非常有用,可以通过克隆现有对象来提高性能。

应用场景:-当一个系统的某些对象的创建比较昂贵时。

-当需要避免构造函数调用,而直接通过复制现有对象来创建新对象时。

5.建造者模式(B ui l d e r)建造者模式将一个复杂对象的构建过程与其表现分离,使得相同的构建过程可以创建不同的表现。

应用场景:-当想要构建一些复杂对象时,如生成器。

-当需要创建对象的过程具有多个步骤,并且每个步骤都可以按需选择或省略时。

结构型设计模式6.适配器模式(A da p t e r)适配器模式将一个类的接口转换为客户端所期望的另一个接口。

常用的设计模式具体实现和相关扩展的方法

常用的设计模式具体实现和相关扩展的方法

常用的设计模式具体实现和相关扩展的方法设计模式是软件开发中经典的解决方案,它们提供了一种可复用的解决方案,以解决常见的软件设计问题。

常用的设计模式包括工厂模式、单例模式、观察者模式等。

本文将介绍这些常用的设计模式的具体实现和相关扩展的方法。

1. 工厂模式工厂模式是一种创建对象的模式,它为客户端提供了一个接口以创建对象,但是具体的类名称并不是在客户端决定的。

工厂模式分为三种类型:简单工厂、工厂方法和抽象工厂。

简单工厂:简单工厂是最基本、最简单的工厂模式,它由一个工厂类根据传入的参数返回不同类的实例。

其优点在于客户端无需关心对象的创建过程,只需知道创建对象的名称即可。

其缺点在于对于新增的类需要修改工厂类的代码,违反了开闭原则。

工厂方法:工厂方法模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。

在工厂方法模式中,客户端不再需要知道所需对象的名称,而是由工厂类负责创建相应的对象。

其优点在于支持新增的类而无需修改工厂类的代码,符合开闭原则。

抽象工厂:抽象工厂模式是一个由多个工厂方法组成的工厂类,它用于创建一系列相关或相互依赖的对象。

抽象工厂模式在工厂方法模式的基础上,增加了对产品族的支持。

其优点在于支持新增的产品族而无需修改工厂类的代码,符合开闭原则。

2. 单例模式单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个访问该实例的全局节点。

单例模式常见的实现方式有懒汉式和饿汉式。

懒汉式:懒汉式是指在需要时才创建单例实例,它的优点在于节省了资源,但是需要考虑线程安全问题。

饿汉式:饿汉式是指在类加载时就创建单例实例,它的优点在于不需要考虑线程安全问题,但是可能会浪费资源。

3. 观察者模式观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

当主题对象发生改变时,它的所有依赖者(观察者)都会收到通知并自动更新。

观察者模式的实现方式包括:基于Java内置观察者模式实现、基于自定义接口实现、基于注解实现等。

24种设计模式的定义和使用场合

24种设计模式的定义和使用场合

一.创建型模式(Creational):简单工厂模式(simpleFactory)发音:['simpl] ['fækt(ə)rɪ]定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口,抽象类,也可以是具体的类.1.抽象工厂(AbstractFactory)发音: ['æbstrækt]定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类.使用场合:1.如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话书,希望一个系统只是知道产品的接口,而不关心实现的时候.2.如果一个系统要由多个产品系列中的一个来配置的时候.换句话说,就是可以,就是可以动态地切换产品簇的时候.3.如果强调一系列相关产品的接口,以便联合使用他们的时候2.建造者模式(Builder)发音: ['bɪldə]定义:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.使用场合:1.如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时2.如果同一个构建过程有着不同的表示时3.工厂方法模式(Factory Method)定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到了子类.使用场景:1.客户类不关心使用哪个具体类,只关心该接口所提供的功能.2.创建过程比较复杂,例如需要初始化其他关联的资源类,读取配置文件等.3.接口有很多具体实现或者抽象类有很多具体子类时,4.不希望给客户程序暴露过多的此类的内部结构,隐藏这些细节可以降低耦合度.5.优化性能,比如缓存大对象或者初始化比较耗时的对象.4.原型模式(Prototype Method)发音: ['prəʊtətaɪp]定义:使用原形实例指定将要创建的对象类型,通过复制这个实例创建新的对象.应用场合:1.如果一个系统想要独立于它想要使用的对象时,可以使用原型模式,让系统只面向接口编程,在系统需要新的对象的时候,可以通过克隆原型来得到.2.如果需要实例化的类是在运行时刻动态指定时,可以使用原型模式,通过克隆原型来得到需要的实例.5.单例模式(Singleton) 发音: ['sɪŋg(ə)lt(ə)n]定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点.使用场合:当需要控制一个类的实例只能有一个,而且客户只能从一个全局访问点访问它时,可以使用单例模式,这些功能恰好是单例模式要解决的问题.二.结构型模式(struct)发音: [strʌkt]6.适配器模式(Adapter)发音:[ə'dæptə]定义:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.使用场合;1.如果先要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口.2.如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这中情况可以使用适配器模式,到时候需要什么就适配什么.3.如果你想使用一些已经窜在的子类,是不坑对每一个子类都进行适配,这中情况可以使用适配器模式,直接适配这些子类的父类就可以了.7.桥接模式(Bridge)发音: [brɪdʒ]定义:将抽象部分与它的实现部分分离,使他们可以独立变化.使用场合:1.如果你不希望在抽象部分和实现部分采用固定的绑定关系,可以采用桥接模式.2.如果出现抽象部分和实现部分都能够扩展的情况,可以采用桥接模式,让抽象部分和实现部分独立地变化.3.如果希望实现部分的修改不会对客户产生影响,可以采用桥接模式.4.如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式.8.组合模式(Composite)发音: ['kɒmpəzɪt]定义:将对象组合成属性结构以表示"部分-整体"的层次结构,组合模式使用的用户对单个对象和组合对象的使用具有一致性.使用场合:1.如果你想表示对象的部分-整体层次结构,可以使用..把整体和部分的操作统一起来,使得层次结构实现更简单,从外部来使用,这个层次结构也容易.2.如果希望同意地使用组合结构中的所有对象,可以选用...,这正是组合模式提供的主要功能.9.装饰器模式(Decorator Method)发音: ['dekəreɪtə]定义:动态的给一个对象增加一些额外的职责,就增加功能来说,装饰模式生成子类更为灵活.使用场合:1.如果需要爱不影响其他对象的情况下,以动态,透明的方式给对象添加职责,可以使用装饰模式.2.如果不适合使用子类来进行扩展的时候,可以考虑使用装饰模式.10.外观模式(Facade)发音: [fə'sɑ:d]定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,这个接口使得这一子系统更加同容易使用.使用场景:1.如果希望为一个复杂的子系统提供一个简单接口的时候,可以考虑使用外观模式.使用外观对象来实现大部分客户需要的功能,从而简化客户的使用.2.如果想要让客户程序和抽象类的实现部分松散耦合,可以考虑使用外观模式,使用外观对象来将这个子系统与他的客户分离开来,从而提高子系统的独立性和可移植性.3.如果构建多层节后的系统,可以考虑使用外观模式使用外观模式对象作为每层的入口,这样可以简化层间调用,也可以松散出层次之间的依赖关系.11.享元模式(Flyweight)发音: ['flaɪweɪt]定义:运用共享技术有效地支持大量细粒度的对象.使用场合:1.如果一个应用程序使用了大量的细粒度对象,可以使用享元模式来减少对象的数量.2.如果犹豫使用大量的对象,造成很大的存储开销,可以使用享元模式来减少对象数量,并节约内存.3.如果对象的大多数状态都可以转变成外部状态,比如通过计算得到,或者从外部传入等,可以使用享元模式来实现内部状态和外部状态的分离.4.如果不考虑对象的外部状态,可以用相对较少的共享对象取代很多组合对象,可以使用享元模式来共享对象.然后组合对象来使用这些共享对象.12.代理模式(Proxy)发音: ['prɒksɪ]定义:为其他对象提供一种代理以控制对这个对象的访问.使用场合:1.需要为一个对象在不同的地址空间提供局部代表的时候,可以使用远程代理.2.需要按照需要创建开销很大的对象的时候,可以使用虚代理.3.需要控制对原始对象的访问的时候,可以使用保护代理.4.需要在访问你对象执行一些附加操作的时候,可以使用智能指引代理.三.行为型模式(behavioral)发音[bi'heivjərəl]13.职责链模式(Chain Of Responsibility)发音: [tʃeɪn] [rɪ,spɒnsɪ'bɪlɪtɪ]定义:使多个对象都有机会处理请求,,从而避免请求的发送者和接收者之间耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.使用场合:1.如果有多个对象可以处理同一个请求,但是具体由哪个对象来处理该请求,是运行时刻动态确定的.2.如果你想在不明确指定接收者的情况下,向多个对象中的其中一个提交请求的话,可以使用职责链模式.3.如果想要动态指定处理一个请求的对象结合,可以使用职责链模式.14.命令模式(Command)发音: [kə'mɑːnd]定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作.15.解释器模式(Interpreter)发音: [ɪn'tɜːprɪtə]定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.使用场合:16.迭代器模式(Iterator)定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示.使用场合:1.如果你希望提供访问一个聚合对象的内容,但是又不想暴露他的内部表示的时候,可以使用迭代器模式来提供迭代器接口,从而让客户端只是通过迭代器的接口来访问聚合对象,而无须关心聚合对象的内部实现.2.如果你希望有多种遍历方式可以访问聚合对象,可以使用...3.如果你希望为遍历不同的聚合对象提供一个统一的接口,可以使用....17.中介模式(Mediator) 发音:['mi:dieitə]定义:用一个中介对象类封装一系列对象的交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互.使用场合:1.如果一组对象之间的通信方式比较复杂,导致相互依赖,结构混乱,可以采用中介模式,把这些对象相互的交互管理起来,各个对象都只需要和中介者交互,从而是的各个对象松散耦合,结构也更清晰易懂.2.如果一个对象引用很多的对象,并直接跟这些对象交互,导致难以复用该对象,可以采用中介者模式,把这个对象跟其他对象的交互封装到中介者对象里面,这个对象只需要和中介者对象交互就可了.18.备忘录模式(Memento)发音: [mɪ'mentəʊ]在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.使用场合:1.如果必须要保存一个对象在某一个时刻的全部或者部分状态,方便以后需要的时候,可以把该对象恢复到先前的状态,可以使用备忘录模式.2.如果需要保存一个对象的内部状态,但是如果用接口来让其他对象直接得到这些需要保存的状态,将会暴露对象的实现希捷并破坏对象的封装性,这是可以使用备忘录.19.观察者模式(Observer)发音: [əb'zɜːvə]定义:定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.使用场合;1.当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化,那么就可以选用观察者模式,将这两者封装成观察者和目标对象,当目标对象变化的时候,依赖于它的观察者对象也会发生相应的变化.这样就把抽象模型的这两个方面分离了使得,它们可以独立地改变和复用.2.如果在更改一个对象的时候,需要同时连带改变其他对象,而且不知道究竟应该有多少对象需要被连带改变,这种情况可以选用观察者模式,被改的那一个对象很明显就相当于是目标对象,而需要连带修改的对歌其他对象,就作为多个观察着对象了.3.当一个对象必须通知其他的对象,但是你又希望这个对象和其他被它通知的对象是松散耦合的,也就是说这个对象其实不详知道具体被通知的对象.这种情况可以选用观察者模式,这个对象就相当于是目标对象,而被它通知的对象就是观察者对象了.20.状态模式(State)发音: [steɪt]允许一个对象在其内部状态改变是改变它的行为.对象看起来似乎修改了他的类.使用场合:1.如果一个对象的行为取决于它的状态,而且它必须在运行时刻根据状态来改变它的行为,可以使用...来包状态和行为分离开.虽然分离了,但是状态和行为是有对应关系的,可以在运行期间,通过改变状态,就能够调用到该状态对应的状态处理对象上去从而改变对象的行为.2.如果一个操作中含有庞大的多分枝语句,而且这些分支依赖于该对象的状态,可以使用....把各个分支的处理分散包装到单独的对象处理类中,这样,这些分支对应的对象就可以不依赖于其他对象而独立变化了.21.策略模式(Strategy)发音: ['strætɪdʒɪ]定义:定义一系列的算法,把它们一个个封装起来,并且使他们可以相互替换.本模式使得算法可独立于使用它的客户而变化.使用场合;1.出现有许多相关的类,仅仅是行为有差别的情况下,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换2.出现同一算法,有很多不同实现的情况下,可以使用策略模式来把这些"不同的实现"实现成为一个算法的类层次.3.需要封装算法中,有与算法相关数据的情况下,可以使用策略模式来避免暴露这些跟算法相关的数据结构.4.出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况下,可以使用策略模式来替换这些条件语句.22.模版方法模式(Template Method)发音:['templeɪt; -plɪt]定义:定义在一个操作中的算法框架,把一些步骤推迟到子类去实现.模版方法模式让子类不需要改变算法的结构而重新定义特定的算法步骤功能:1.能够解决代码的冗余问题2.把某些算法步骤延迟到子类3.易于扩展4.父类提供了算法框架,控制了算法的执行流程,而子类不能改变算法的流程,子类的方法的调用由父类的模版方法决定.5.父类可以把那些重要的,不允许改变的方法屏蔽掉,不让子类去复写他们.1.需要固定定义算法骨架,实现一个算法的不变的部分,并把可变的行为留给子类来实现的情况.2.各个子类中具有公共行为,应该抽取出来,集中在一个公共类中去实现,从而避免复杂的代码重复3.需要控制子类扩展的情况.模版方法模式会在特定的点来调用子类的方法,这样只允许在这些点进行扩展.知识:回调:表示一段可执行逻辑的引用(或者指针),我们把该引用(或者指针)传递到另外一段逻辑(或者方法)里供这段逻辑适时调用(网站:)23.访问者模式(Visitor)发音:['vɪzɪtə]定义:表示一个作用于某对象结构中的各个元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.使用场合:1.如果想对一个对象结构实施一些依赖于对象结构中具体类的操作,可以使用访问者模式.2.如果想对一个对象结构中的各个元素进行很多不同的而且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式.3.如果对象结构很少变动,但是需要经常给对象结构中的元素定义新的操作,可以使用访问者模式.3.如果对象结构很少变动,但是需要经常给对象结构中的元素定义新的操作,可以使用访问者模式.。

面向对象程序设计中的设计模式

面向对象程序设计中的设计模式

面向对象程序设计中的设计模式面向对象程序设计(Object-Oriented Programming,简称OOP)中的设计模式,是指在软件设计过程中,通过经验总结,提取出的一些解决特定问题的通用解决方案。

设计模式在软件开发领域中广泛应用,可以提高程序的可重用性、可维护性、可扩展性等。

本文将介绍常用的几种设计模式及其应用场景。

一、单例模式单例模式是一种保证只存在一个实例对象的设计模式。

在需要创建一个全局唯一、可共享的对象时,可以使用单例模式。

单例模式在工厂模式中常常被用到,以保证工厂类只被实例化一次,并且在整个系统中只能存在一个实例。

二、工厂模式工厂模式是一种将对象的创建工作交给专门的工厂类来完成的设计模式。

工厂模式将对象的创建与使用分离,客户端只需要知道需要创建哪种对象,而不需要知道对象的具体实现细节。

工厂模式分为三种,分别为简单工厂模式、工厂方法模式和抽象工厂模式。

三、建造者模式建造者模式是一种将复杂对象的构建与表示分离的设计模式。

通过建造者模式,可以将一个复杂对象的构建过程分解成一系列简单的构建步骤,使得不同的构建步骤可以灵活组合,从而创建出不同的对象。

建造者模式常常被用在需要创建大量相似对象的场景中。

四、适配器模式适配器模式是一种将一个对象的接口转换成另一个客户端所需要的接口的设计模式。

当一个类的接口与现有系统接口不一致时,可以使用适配器模式将其进行转换。

适配器模式常被用在系统扩展、接口升级等场景中。

五、观察者模式观察者模式是一种在对象之间定义一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都能够收到通知并自动更新的设计模式。

观察者模式常被用在图形界面、事件驱动、消息通讯等场景中。

六、装饰器模式装饰器模式是一种在不改变原有对象结构的情况下,动态地给一个对象添加更多的职责的设计模式。

装饰器模式通过继承或者组合的方式,动态地为对象添加新的行为,从而扩展了原有对象的功能。

装饰器模式常被用在对现有系统进行增量开发、功能扩展等场景中。

简单工厂与工厂方法模式的区别

简单工厂与工厂方法模式的区别

简单工厂与工厂方法模式的区别软件开发中的设计模式是一种特定的解决方案,它可以用来解决一种在软件开发中普遍存在的问题。

在这些模式中,工厂模式是最为广泛使用的模式之一。

在工厂模式中,有两种基本的类型——简单工厂和工厂方法模式。

虽然这两种方法本质上是相同的,但它们之间也存在着一些关键的区别。

## 简单工厂模式简单工厂模式是一种创建型模式,它允许用户根据需要创建一个对象,而不必知道对象的具体类。

这个模式可以有效地将对象创建的过程抽象出来,并把它们放在一个工厂类中,这个工厂类根据用户的输入信息决定应该创建哪个具体的对象。

简单工厂模式的核心是工厂类,它是一个包含多个静态方法的类,这些静态方法根据用户的需求创建不同类型的对象。

例如,在一个汽车制造工厂中,简单工厂模式可以用来创建不同类型的车辆,例如轿车、跑车或 SUV。

用户只需提供所需类型的参数,简单工厂就可以根据当前需求返回相应的实例对象。

以下是简单工厂的实现示例:```class CarFactory {public static Car getCar(String carType) {if (carType == null) {return null;}if (carType.equalsIgnoreCase("SUV")) {return new SUV();}else if (carType.equalsIgnoreCase("sedan")) {return new Sedan();}else if (carType.equalsIgnoreCase("SportsCar")) { return new SportsCar();}return null;}class SUV implements Car {public void drive() {System.out.println("Driving SUV");}}class Sedan implements Car {public void drive() {System.out.println("Driving Sedan");}}class SportsCar implements Car {public void drive() {System.out.println("Driving Sports Car"); }interface Car {void drive();}```在上面的示例中,接口 Car 定义了一个 drive 方法,这个方法用来描述不同的车辆如何行驶。

软件开发中常见的设计模式

软件开发中常见的设计模式

软件开发中常见的设计模式软件开发中,设计模式是一个非常重要的概念。

设计模式代表了一组被反复使用的最佳实践,可以用于解决特定问题。

设计模式可以帮助开发者更好地组织和管理代码,避免重复劳动,提高代码的可读性、可维护性和可扩展性。

下面,我们来介绍一些常见的设计模式。

一、单例模式单例模式是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点。

单例模式通常用于管理资源,例如数据库连接、线程池、日志记录器等。

单例模式有几种实现方式,最常见的是饿汉式和懒汉式。

饿汉式在类加载时就会创建实例,而懒汉式则是在第一次使用时才会创建实例。

二、工厂模式工厂模式是一种创建型模式,它用工厂方法代替了new操作符来实例化对象。

工厂模式可以隐藏具体产品类的实现细节,使客户端无需关心具体的产品实现,只需要知道工厂可以创建出所需产品即可。

工厂模式可以分为简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式适用于只有一个工厂类,可以根据输入参数创建不同的具体产品。

工厂方法模式适用于多个工厂类,每个工厂类负责创建一种具体产品。

抽象工厂模式适用于具有多个产品族的结构,每个工厂类负责创建一个产品族。

三、代理模式代理模式是一种结构型模式,它为其他对象提供一种代理以控制对这个对象的访问。

代理对象可以在不改变原始对象的情况下,对原始对象进行增强或者限制访问。

代理模式有多种实现方式,最常见的是静态代理和动态代理。

静态代理需要手动编写代理类,代理类与被代理类的接口一致,会将请求转发给被代理对象。

动态代理则是在运行时动态创建代理类,可以选择在特定的方法前后加入增强逻辑。

四、观察者模式观察者模式是一种行为型模式,它定义了一种一对多的依赖关系,让多个观察者对象同步地监听一个主题对象,当主题对象发生改变时,会通知所有观察者对象,使它们能够自动更新。

观察者模式由两个核心角色组成,一个是主题(Subject),一个是观察者(Observer)。

主题负责维护对观察者的引用列表,并提供注册/删除观察者和通知观察者的方法。

软件设计模式中的工厂模式

软件设计模式中的工厂模式

软件设计模式中的工厂模式在软件设计和开发中,模式是一种重要的技术手段,它可以用来解决不同的问题,提高代码的可重用性和可维护性。

工厂模式是一种常用的设计模式,它可以将对象的创建和使用分离开来,使得程序可以更加灵活地处理对象的生成和管理。

本文将介绍工厂模式的相关知识,包括其基本概念、实现方法和应用场景等。

一、基本概念工厂模式是一种创建型模式,其核心思想是将对象的创建过程封装起来,让客户端通过调用工厂类来获取所需的对象。

工厂模式分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。

其中,简单工厂模式只有一个工厂类,它根据客户端传递的参数来生成不同的对象;工厂方法模式中,每个对象都有一个对应的工厂类,由客户端决定使用哪个工厂类来创建对象;抽象工厂模式中,一个工厂类可以生成多个产品族的对象,即一组相关的对象。

二、实现方法实现工厂模式需要注意以下几点:1.定义一个工厂接口,用于描述工厂的功能。

2.定义一个工厂类,该类实现工厂接口,并提供一个可以生成对象的方法。

3.定义一个产品接口,用于规范不同类型的产品。

4.定义多个具体产品类,它们都实现产品接口。

5.客户端使用工厂类来生成所需的对象,而不是直接创建对象。

三、应用场景工厂模式适用于以下场景:1.需要大量创建相似对象的情况。

2.需要在不同的环境下生成不同的对象时。

3.需要封装对象的创建过程,提高代码的可维护性和可重用性。

4.需要对客户端隐藏具体的实现细节,从而降低客户端和产品的耦合度。

四、总结工厂模式是一种常用的设计模式,它可以将对象的创建和使用分离开来,使得程序可以更加灵活地处理对象的生成和管理。

工厂模式分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。

实现工厂模式需要定义工厂接口、工厂类、产品接口和具体产品类等。

工厂模式适用于需要大量创建相似对象、需要封装对象创建过程或需要隐藏具体实现细节的情况下。

设计模式的分类

设计模式的分类

设计模式的分类设计模式是一种被广泛应用于软件工程领域的最佳实践,它为软件开发提供了一种适用于特定情境下的可重用解决方案,能够提高软件系统的可维护性、可扩展性和可重用性。

设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。

一、创建型模式1. 单例模式单例模式是一种创建型模式,用于确保一个类只有一个实例,并提供全局访问点。

单例模式适用于那些需要唯一的对象来协调系统操作的情况,如配置管理器、日志记录器等。

实现单例模式的方法有饿汉式和懒汉式,其中饿汉式在类加载时就创建了实例,而懒汉式在第一次使用时才创建实例。

2. 工厂模式工厂模式是一种创建型模式,用于将对象的创建过程封装在一个工厂类中,并通过调用工厂类的方法来创建对象。

工厂模式适用于那些需要根据不同条件创建不同对象的情况,如数据库连接池。

实现工厂模式的方法有简单工厂模式、工厂方法模式和抽象工厂模式,其中简单工厂模式将对象的创建过程封装在一个工厂类的静态方法中,而工厂方法模式和抽象工厂模式则通过定义一个抽象的工厂类和具体的工厂类来实现。

3. 原型模式原型模式是一种创建型模式,用于通过克隆(深拷贝或浅拷贝)已有对象来创建新的对象,而不是通过调用构造函数创建。

原型模式适用于那些需要创建大量相似对象的情况,如游戏中的敌人。

实现原型模式的方法有浅拷贝和深拷贝,其中浅拷贝只复制对象的基本类型属性,而深拷贝则复制对象的所有属性。

二、结构型模式1. 适配器模式适配器模式是一种结构型模式,用于将一个类的接口转换成客户端所期望的另一个接口,从而使原本不兼容的类能够协同工作。

适配器模式适用于那些需要使用已有的类库或接口,但这些类库或接口与当前系统不兼容的情况,如国际化(I18N)处理。

实现适配器模式的方法有类适配器模式和对象适配器模式,其中类适配器模式通过多继承实现,而对象适配器模式通过组合实现。

2. 装饰器模式装饰器模式是一种结构型模式,用于动态地给对象添加功能,而不需要修改对象的代码。

工厂方法和抽象工厂的区别

工厂方法和抽象工厂的区别

工厂方法和抽象工厂的区别工厂方法和抽象工厂是两种常用的设计模式,它们在软件工程中起着至关重要的作用。

虽然它们都属于工厂模式,但在实际应用中却有着不同的特点和用途。

本文将从几个方面对工厂方法和抽象工厂进行比较,以便更好地理解它们之间的区别。

首先,工厂方法模式是一种创建型模式,它定义了一个用于创建对象的接口,但将具体的实现延迟到子类中。

换句话说,工厂方法模式将对象的创建委托给子类,每个子类负责实例化自己的对象。

这样一来,客户端代码就不需要知道具体的对象是如何创建的,只需要通过工厂方法来获取对象即可。

而抽象工厂模式则是一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

简单来说,抽象工厂模式提供了一个创建一系列产品的接口,而具体的产品由具体的工厂来创建。

其次,工厂方法模式更注重于对象的创建过程,它将对象的创建和使用分离开来,使得对象的创建更加灵活。

而抽象工厂模式更注重于一系列相关对象的创建,它将一系列相关的对象组合成一个产品族,使得客户端可以一次性获取一整套的产品。

此外,工厂方法模式适用于单一产品的创建,每个工厂只负责创建一种产品。

而抽象工厂模式适用于一系列相关产品的创建,一个工厂可以创建多个相关的产品。

因此,当需要创建多个相关的产品时,可以考虑使用抽象工厂模式,而当只需要创建单一产品时,可以考虑使用工厂方法模式。

最后,工厂方法模式和抽象工厂模式都是用来解决对象的创建问题的,它们都能够有效地降低对象之间的耦合度,使得系统更加灵活和可扩展。

但是在具体的使用中,需要根据实际的需求来选择合适的模式,以便更好地满足系统的需求。

综上所述,工厂方法模式和抽象工厂模式在实际应用中有着不同的特点和用途。

工厂方法模式更注重于对象的创建过程,适用于单一产品的创建;而抽象工厂模式更注重于一系列相关产品的创建,适用于一次性获取一整套产品。

因此,在实际的软件开发中,需要根据具体的需求来选择合适的模式,以便更好地满足系统的需求。

23种编程设计模式

23种编程设计模式

23种编程设计模式编程设计模式是在软件开发过程中经过实践验证的解决问题的方案,它们是解决常见问题的模板。

在设计模式的指导下,开发人员可以更加高效地开发出可维护、可扩展的软件。

本文将介绍23种常见的编程设计模式。

1.创建型模式:-工厂方法模式:当需要创建复杂对象时,通过工厂方法来解决对象的创建问题,将具体对象的创建延迟到子类中。

-抽象工厂模式:提供一个接口,用于创建一系列相关或相互依赖的对象,而不需要指定具体类。

-单例模式:确保类只有一个实例,并提供一个全局访问点。

-原型模式:通过复制现有对象的方式,创建新的对象。

2.结构型模式:-适配器模式:将一个类的接口转换成客户期望的另一个接口,使得原本因接口不兼容而无法工作的类可以一起工作。

-桥接模式:将抽象部分与它们的实现部分分离,以便二者可以独立地变化。

-组合模式:将对象组合成树形结构以表示“整体-部分”层次结构。

-装饰器模式:动态地给对象添加一些额外的职责,而不需要修改其原始类的代码。

-外观模式:提供一个统一的接口,用于访问子系统中一群接口的功能。

-享元模式:通过共享对象来减少内存使用量。

-代理模式:为其他对象提供一个代理,以控制对这个对象的访问。

3.行为型模式:-责任链模式:将请求的发送者和接收者解耦。

-命令模式:将请求封装成一个对象,从而允许参数化对客户端不同的请求、排队或记录请求日志,以及支持可撤消的操作。

-解释器模式:定义一个语言的文法,并且建立一个解释器来解释该语言中的句子。

-迭代器模式:提供一种顺序访问聚合对象中各个元素的方法,而又不暴露聚合对象的内部表示。

-中介者模式:用一个中介对象来封装一系列的对象交互。

-备忘录模式:在不违背封装原则的前提下,保存对象内部状态的快照,以便在将来需要时恢复到该状态。

-观察者模式:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生变化时,所有依赖它的对象都得到通知。

-状态模式:允许对象在其内部状态改变时改变它的行为。

抽象工厂和简单工厂的区别

抽象工厂和简单工厂的区别

抽象工厂和简单工厂的区别抽象工厂和简单工厂都是在软件开发中用于创建对象的设计模式,但它们之间存在着一些明显的区别。

简单工厂模式比较直接。

就像是你去一个小餐馆,菜单很简单,你说要个汉堡,老板就直接按照他熟悉的做法给你做一个。

在简单工厂模式里,有一个工厂类,这个类有一个创建对象的方法。

当你需要某个产品对象的时候,就调用这个方法,然后工厂类根据传入的参数或者内部的逻辑来决定创建哪种具体的产品对象。

比如说,有一个形状工厂,你告诉它你要圆形,它就给你创建一个圆形的对象。

这种模式简单易懂,适合创建的对象种类不是特别多,逻辑也不复杂的情况。

而抽象工厂模式就像是去一个大的综合性餐厅。

这个餐厅有不同的菜系,每个菜系下面又有不同的菜品。

抽象工厂模式里有一个抽象工厂类,这个类定义了创建一组相关产品的接口。

然后有具体的工厂类去实现这个接口,每个具体工厂类负责创建属于自己这一组的产品。

例如,有一个家具抽象工厂,有现代风格家具工厂和古典风格家具工厂。

现代风格家具工厂能创建现代风格的沙发、椅子、桌子等;古典风格家具工厂能创建古典风格的同类家具。

这种模式适用于创建的对象之间存在比较复杂的关联关系,而且需要根据不同的条件创建不同系列的产品。

从灵活性来看,抽象工厂模式更胜一筹。

简单工厂模式如果要增加新的产品类型,可能需要修改工厂类的创建方法,这就好比小餐馆想增加新菜品,可能得改变厨房做菜的基本流程。

而抽象工厂模式增加新的产品系列比较容易,只要增加一个新的具体工厂类就好,就像餐厅想增加一个新的菜系,只要单独开辟一个区域来做这个菜系就可以,不用大改原有的流程。

从代码的复杂度来说,简单工厂模式相对简单,代码量少,容易理解。

对于初学者或者小型项目来说比较友好。

抽象工厂模式因为要处理更多的抽象和具体类之间的关系,代码结构相对复杂一些,但是对于大型项目,特别是需要对不同系列的产品进行管理和扩展的时候,它就非常有用了。

总的来说,抽象工厂和简单工厂都有它们各自的适用场景,就像不同类型的餐厅适合不同的顾客需求一样,在软件开发中,我们要根据项目的实际情况来选择合适的设计模式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第一种表述
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式。

其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性。

本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解。

简单工厂
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。

不修改代码的话,是无法扩展的。

工厂方法
工厂方法是针对每一种产品提供一个工厂类。

通过不同的工厂实例来创建不同的产品实例。

在同一等级结构中,支持增加任意产品。

抽象工厂
抽象工厂是应对产品族概念的。

比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

小结
★工厂模式中,重要的是工厂类,而不是产品类。

产品类可以是多种形式,多层继承或者是单个类都是可以的。

但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。

★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。

★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

区别
简单工厂:用来生产同一等级结构中的任意产品。

(对于增加新的产品,无能为力)工厂模式:用来生产同一等级结构中的固定产品。

(支持增加任意产品)
抽象工厂:用来生产不同产品族的全部产品。

(对于增加新的产品,无能为力;支持增加产品族)以上三种工厂方法在等级结构和产品族这两个方向上的支持程度不同。

所以要根据情况考虑应该使用哪种方法。

第二种表述
简单工厂、工厂方法和抽象工厂都是创建型的设计模式。

三者的共同点是:
1、都有两种作用不同的类:产品类和工厂类。

其中,工厂类在自己的方法中实例化产品类(即使用new命令生成产品类的对象),并将生成的产品类的对象提供给外部使用。

2、创建的过程,都是类似的:工厂类得到一个标志(可以由程序输入,也可以读取配置文件中的内容),返回一个产品对象。

三者的不同点:
1、简单工厂
简单工厂方法中,包括一个“抽象产品类”(该类可以是接口Interface,也可以是实际的类Class),所有需要的产品类都是该“抽象产品类”的子类(如果是接口的话,那么就是说所有产品类都继承了该接口)。

简单工厂一般只包含一个具体的工厂类,由该工厂类生成所有的产品类的对象。

生成产品类的方法,其内部一般是类似于switch的结构,根据输入的标志,选择创建不同类型的对象。

由于不知道创建的对象到底是哪个类的,所以方法的返回值的类型是“抽象产品类”。

2、工厂方法
抽象工厂中,包括“抽象工厂类”和“抽象产品类”,同时包含不只一个工厂类。

所有的工厂类都必须是“抽象工厂类”的子类,所有的产品都必须是“抽象产品类”的子类。

和简单工厂比起来,工厂方法一般是从抽象工厂开始的。

一般都是在抽象工厂类中提供一个静态方法,由该方法根据输入的标志,生成不同的具体工厂类,然后由具体的产品类生成具体的产品。

注意,一个具体工厂类只能生成一种具体的产品类的对象,不同的具体工厂生成不同的产品,而不是像简单工厂中那样,一个工厂类可以生成多种不同产品类的对象。

可以这么理解,在选择不同的具体工厂类的时候,就选择了生成的产品,相对于简单工厂,相当于将选择产品的动作提前了。

因为不知道创建的具体工厂类到底是哪一个,所以生成具体工厂类的静态方法的返回值的类型是“抽象工厂类”。

具体工厂类生成产品类的方法,返回值的类型也要求是“抽象产品类”(因为前端调用的时候,需要使用同样的代码来访问)。

3、抽象工厂
抽象工厂和工厂方法很类似,区别如下:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

相关文档
最新文档