9 设计模式(3)--Factory,Singleton模式
常见设计模式及应用场景

常见设计模式及应用场景设计模式是一种解决特定问题的经验总结,可以提高代码的可重用性、可读性和灵活性。
在软件开发过程中,常见的设计模式有23种,下面将对其中的几种常见的设计模式及其应用场景进行介绍。
1. 单例模式(Singleton Pattern):单例模式用于限制一个类只能有一个实例,并提供一个全局访问点。
在需要频繁创建和销毁对象的场景下,可以使用单例模式来减少系统开销。
例如,在多线程环境下需要共享某个资源时,通过单例模式可以保证该资源只有一个实例。
2. 工厂模式(Factory Pattern):工厂模式用于创建对象,把实例化对象的过程封装在一个工厂类中。
它解耦了对象的创建和使用,提高了代码的可扩展性。
例如,一个电商平台上有多种类型的商品,可以通过工厂模式根据用户的选择来创建相应类型的商品。
3. 观察者模式(Observer Pattern):观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
观察者模式适用于对象之间存在一种一对多的关系,并且对象之间需要保持一致。
例如,一个新闻发布系统中,当发布一条新闻时,系统需要通知所有订阅该新闻频道的用户。
4. 策略模式(Strategy Pattern):策略模式定义了一系列可以互相替换的算法,并根据具体情况选择合适的算法。
使用策略模式可以避免使用大量的if-else语句,提高代码的可维护性和扩展性。
例如,在一个电商平台中,根据会员等级的不同,可以采用不同的折扣策略来计算商品的价格。
5. 适配器模式(Adapter Pattern):适配器模式用于将两个不兼容的接口转换为可兼容的接口,使得不同的类可以协同工作。
适配器模式可以增强代码的复用性和灵活性。
例如,一个音频播放器只支持mp3格式的音乐文件,当我们需要播放其他格式的音乐文件时,可以使用适配器模式将不同格式的音乐文件转换为mp3格式。
6. 建造者模式(Builder Pattern):建造者模式可以将创建复杂对象的过程与表示分离,使得同样的创建过程可以创建不同的表示。
设计模式的分类及功能划分

设计模式的分类及功能划分设计模式有两种分类⽅法,即根据模式的⽬的来分和根据模式的作⽤的范围来分。
⼀、根据⽬的来分;通过完成什么⼯作划分为创建型模式、结构型模式和⾏为型模式 3 种类型 1、创建型模式:作⽤于对象的创建,将对象的创建与使⽤分离。
其中囊括了单例、原型、⼯⼚⽅法、抽象⼯⼚、建造者5 种创建型模式。
2、结构型模式:将类或对象按某种布局组成更⼤的结构,其中以代理、适配器、桥接、装饰、外观、享元、组合 7 种结构型模式为主。
3、⾏为型模式:作⽤于类或对象之间相互协作共同完成单个对象⽆法单独完成的任务,以及怎样分配职责。
主要包含了模板⽅法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种⾏为型模式。
⼆、根据作⽤范围来分;根据是⽤于类上还是⽤于对象上划分分为类模式和对象模式两种。
1、类模式:⽤于处理类与⼦类之间的关系,这些关系通过继承来建⽴,在编译时刻便确定下来了。
⼯⼚⽅法、(类)适配器、模板⽅法、解释器均属于该模式。
2、对象模式:⽤于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运⾏时刻是可以变化的,更具动态性。
除了以上 4种,其他的都是对象模式。
设计模式的分类表设计模式的功能1、单例(Singleton)模式:某个类只能⽣成⼀个实例,该类提供了⼀个全局访问点供外部获取该实例,其拓展是有限多例模式。
2、原型(Prototype)模式:将⼀个对象作为原型,通过对其进⾏复制⽽克隆出多个和原型类似的新实例。
3、⼯⼚⽅法(Factory Method)模式:定义⼀个⽤于创建产品的接⼝,由⼦类决定⽣产什么产品。
4、抽象⼯⼚(AbstractFactory)模式:提供⼀个创建产品族的接⼝,其每个⼦类可以⽣产⼀系列相关的产品。
5、建造者(Builder)模式:将⼀个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
6、代理(Proxy)模式:为某对象提供⼀种代理以控制对该对象的访问。
23种设计模式

目录创建型1. Factory Method(工厂方法)2. Abstract Factory(抽象工厂)3. Builder(建造者)4. Prototype(原型)5. Singleton(单例)结构型6. Adapter Class/Object(适配器)7. Bridge(桥接)8. Composite(组合)9. Decorator(装饰)10. Facade(外观)11. Flyweight(享元)12. Proxy(代理)行为型13. Interpreter(解释器)14. Template Method(模板方法)15. Chain of Responsibility(责任链)16. Command(命令)17. Iterator(迭代器)18. Mediator(中介者)19. Memento(备忘录)20. Observer(观察者)21. State(状态)22. Strategy(策略)23. Visitor(访问者)创建型1.Factory Method(工厂方法)FactoryMethod.uml意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method 使一个类的实例化延迟到其子类。
适用性:当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
2.Abstract Factory(抽象工厂)意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性:一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
3.Builder(建造者)意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
23种设计模式书

23种设计模式书23种设计模式书是指《设计模式》一书中所介绍的23种常见的软件设计模式。
这些设计模式是在软件开发中经过验证和应用的最佳实践,可以帮助开发人员解决各种常见的设计问题。
本文将依次介绍这23种设计模式,并对每种模式进行简要的说明和应用场景的介绍,以帮助读者更好地理解和应用这些设计模式。
1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
2. 工厂模式(Factory):将对象的创建和使用分离,通过工厂类来创建对象。
3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。
4. 建造者模式(Builder):将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
5. 原型模式(Prototype):通过复制已有对象来创建新对象,避免了创建过程的复杂性。
6. 适配器模式(Adapter):将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。
7. 桥接模式(Bridge):将抽象部分和实现部分分离,使它们可以独立变化。
8. 过滤器模式(Filter):使用标准来过滤一组对象,获取满足条件的子集。
9. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。
10. 装饰器模式(Decorator):动态地给一个对象添加额外的职责,同时又不改变其结构。
11. 外观模式(Facade):提供一个统一的接口,用来访问子系统中的一群接口。
12. 享元模式(Flyweight):通过共享对象来有效地支持大量细粒度的对象。
13. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
14. 责任链模式(Chain of Responsibility):将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。
15. 命令模式(Command):将一个请求封装成一个对象,从而可以用不同的请求对客户进行参数化。
23种设计模式记忆口诀

23种设计模式记忆口诀设计模式是软件开发中常见的解决方案模板,它们能够解决许多常见的设计问题。
为了帮助记忆23种设计模式,可以使用下面这个口诀来记忆:Creational Patterns(创建型模式):1. Singleton(单例模式):一个类能产生一个实例,全局访问。
2. Builder(建造者模式):分步骤创建复杂对象,易拓展。
3. Factory Method(工厂方法模式):子类决定实例化哪个对象。
4. Abstract Factory(抽象工厂模式):创建一组相关对象,不依赖具体类。
5. Prototype(原型模式):通过复制现有对象来创建新对象。
Structural Patterns(结构型模式):6. Adapter(适配器模式):将类的接口转换为客户端希望的接口。
7. Bridge(桥接模式):将抽象部分与实际部分分离。
将对象组合成树形结构来表示部分整体的层次结构。
9. Decorator(装饰器模式):动态地给对象添加功能。
10. Facade(外观模式):提供一个统一的接口,简化客户端使用。
11. Flyweight(享元模式):共享细粒度对象,减少内存使用。
12. Proxy(代理模式):控制对其他对象的访问。
Behavioral Patterns(行为型模式):13. Chain Of Responsibility(责任链模式):将请求的发送者和接收者解耦,多个对象都可能处理请求。
将请求封装成对象,可以用参数化方式处理。
15. Iterator(迭代器模式):提供一种遍历集合的统一接口。
16. Mediator(中介者模式):将多个对象之间的复杂关系解耦。
17. Memento(备忘录模式):将对象的状态保存起来,以后可以恢复。
18. Observer(观察者模式):当一个对象改变状态时,依赖它的对象都会收到通知。
19. State(状态模式):对象的行为随状态的改变而改变。
java常用的设计模式及应用场景

java常用的设计模式及应用场景一、单例模式(Singleton)单例模式是一种对象创建型模式,它指的是设计一个类,使其只能生成一个实例。
它只提供一个类实例,保证只有一个实例存在。
有时候,只需要一个类的实例来控制整个系统,例如实现一个全局的缓存,或是建立一个共享的日志记录器,单例模式可以很好的实现这个目的。
应用场景:1、对于需要频繁创建和销毁的对象,可以考虑使用单例模式,以避免过多地重复创建和销毁造成系统开销。
2、对于某些资源比较宝贵的对象,例如数据库连接,则可以用单例模式进行封装,保证全局应用程序只有一个,从而避免重复创建,浪费资源。
二、工厂模式(Factory)工厂模式是一种类创建型模式,它把类的实例化推迟到子类来完成。
它用于隔离客户类和实例化对象,通过声明抽象类类来定义构造过程,将不同的定义转移到不同的子类中去,从而使用户不需要关心实例化过程。
1、在有大量不同对象需要创建和管理的情况下,可以利用工厂模式封装类的实例化和存储,将池中不同对象来进行统一管理。
2、在使用设计模式的情况下,复杂的类结构已经不适合用一个实例来创建,可以采用工厂模式实现多个类的实例化,让用户不用关心对象实例的创建过程。
抽象工厂模式是一种工厂模式的拓展,它把简单工厂模式的单一职责拆分为多个类,从而实现一个系列相关的或相互依赖的工厂,以满足比较复杂的对象创建需求。
1、在需要创建复杂对象,而复杂对象又由多个部件组成的情况下,例如计算机,单一工厂模式已经不能满足需求,那么可以通过抽象工厂模式来实现。
2、在需要产生大量不同类型的对象,或者存在一系列相互依赖的产品族,这种情况下可以使用抽象工厂模式,将工厂定义为不同维度组成的一个系列。
四、建造者模式(Builder)建造者模式是一种设计模式,它也叫构造子模式,通过使用建造者模式,客户端可以不必担心具体的生产过程,只需要给出具体的请求,由建造者来负责构造出请求的产品对象。
1、在有复杂的产品对象的时候,例如需要对多个部件进行拼装,以构造出复杂的对象,可以采用建造者模式将复杂的拼装过程进行封装,避免复杂的拼装过程变得混乱。
23种设计模式 详解
23种设计模式详解设计模式是指面向对象编程中,经过多次验证、被广泛接受的代码实现方法。
这些设计模式可以帮助开发者更快地解决问题,提高代码的可读性、可维护性、可扩展性。
目前,常用的设计模式有23种。
下面,我们来详细介绍一下这23种设计模式。
1. 单例模式(Singleton)单例模式是一种只允许生成一个实例的模式。
在实例化对象时,单例模式的生成过程比较特殊,需要先判断该类是否已经实例化过,如果已经实例化,则直接返回已有的实例对象,否则再进行实例化。
2. 工厂模式(Factory)工厂模式是一种生产对象实例的设计模式。
它将对象实例的生成过程封装在一个工厂类中,客户端需要对象时,只需要调用工厂类中对应的方法即可。
3. 抽象工厂模式(Abstract Factory)抽象工厂模式是一种扩展了工厂模式的模式。
它可以生成一系列相关或相互依赖的对象实例。
具体实现时,通常需要定义一个抽象工厂类和一些具体工厂类,来生产各种相关的对象实例。
4. 建造者模式(Builder)建造者模式是一种用于构建复杂对象的模式。
它将一个复杂对象的构建过程分解成多个简单的步骤,然后通过一个指挥者来管理这些步骤的执行,最终构建出一个复杂的对象。
5. 原型模式(Prototype)原型模式是一种通过复制已有对象来创建新对象的模式。
一般来说,系统中的对象包含大量相同或相似的部分,通过复制对象可以帮助我们节省生成对象的时间和资源。
6. 适配器模式(Adapter)适配器模式是一种将不兼容接口转换为兼容接口的模式。
具体实现时,需要定义一个适配器类,该类实现了客户端所期望的接口,而且还包装了原有不兼容的接口,使其能够兼容客户端期望的接口。
7. 桥接模式(Bridge)桥接模式是一种将抽象部分与其实现部分分离开来的模式。
具体实现时,需要定义抽象部分和实现部分的接口,然后定义一个桥接类,将抽象部分和实现部分联系起来。
8. 组合模式(Composite)组合模式是一种将具有相同属性和方法的对象组合成树形结构的模式。
面向对象设计中的设计模式及应用场景
面向对象设计中的设计模式及应用场景引言:面向对象设计模式是一套经过实践验证的、用来解决软件设计中常见问题的模板,是软件开发中重要的部分。
通过使用设计模式,可以使得软件设计更加灵活、可复用、可维护,并且降低了代码的耦合性。
本文将介绍几种常见的面向对象设计模式及其应用场景。
1.单例模式(Singleton)单例模式是一种只允许创建一个实例的设计模式。
它在需要控制资源访问和限制实例个数的场景中非常有用。
例如,在一个多线程的应用中,多个线程需要共享一个资源,但又不能创建多个实例时,单例模式就能很好地解决这个问题。
另外,数据库连接池是一个常见的使用单例模式的应用场景,因为数据库连接资源是有限的,需要限制实例的个数。
2.工厂模式(Factory)工厂模式是一种用来创建对象的设计模式。
通过工厂模式,可以将对象的创建过程封装起来,使得客户端代码不需要知道具体的对象创建细节。
例如,在一个手机生产厂家中,可以定义一个手机工厂类,该工厂类负责创建不同型号的手机对象。
客户端只需调用工厂类的方法,即可获得所需的手机对象。
3.观察者模式(Observer)观察者模式是一种发布-订阅模式,它定义了一种一对多的关系。
当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。
这种模式常用于事件处理系统,例如在一个图形界面程序中,当用户点击按钮时,监听该按钮的组件会接收到通知,并执行相应的操作。
4.策略模式(Strategy)策略模式允许在运行时根据需求选择一种算法或行为。
它将算法和行为封装到自己的类中,并将其与主类解耦,从而可以在不修改代码的情况下动态切换算法和行为。
例如,在一个电商网站中,购物车的计算方式可以有多种选择,可以根据用户的等级、活动等不同情况选择不同的计算方式。
5.适配器模式(Adapter)适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。
适配器模式常用于不兼容接口的类之间的适配。
例如,当我们使用一个第三方库时,库的接口可能与我们的代码不兼容。
解读设计模式及其在实际项目中的应用
解读设计模式及其在实际项目中的应用设计模式是软件开发中的一种经验总结,是前辈们在解决软件设计和开发过程中遇到的一些常见问题,总结出来的最佳实践。
设计模式提供了一种在特定情境下解决问题的经典方式,能够帮助开发者以一种可重用、可维护、可扩展的方式构建软件系统。
在软件开发过程中应用设计模式,能够提高开发效率、降低与他人合作的成本、提高软件质量、减少重复代码的出现,并且使得软件结构更加清晰易读。
下面我们来详细解读一些常见的设计模式以及它们在实际项目中的应用。
1. 单例模式(Singleton Pattern)单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。
在实际项目中,单例模式常常被用来管理共享资源、日志记录器、数据库连接等。
例如,在一个多线程的应用程序中,我们可以使用单例模式确保只有一个线程在访问共享资源,从而避免资源的竞争。
2. 工厂模式(Factory Pattern)工厂模式是一种创建型设计模式,用于通过一个工厂类创建对象,而无需显式指定具体的类。
工厂模式可提供一种灵活性,使得程序能够适应修改而无需修改大量的代码。
在实际项目中,工厂模式常用于封装对象的创建过程,并通过一个通用的接口来返回具体的实例。
3. 观察者模式(Observer Pattern)观察者模式是一种行为型设计模式,其中一个对象(称为主题)维护一系列依赖于它的对象(称为观察者),并在状态发生改变时自动通知这些观察者。
观察者模式能够实现松耦合,提高代码的可重用性和可扩展性。
在实际项目中,观察者模式被广泛应用于事件处理、消息队列、组件间的通信等场景。
4. 适配器模式(Adapter Pattern)适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的接口。
适配器模式能够解决两个不兼容接口之间的兼容问题,使得它们能够一起工作。
在实际项目中,适配器模式常用于集成第三方库、系统间的接口适配、旧系统升级等场景。
c++设计模式及其应用场景
C++设计模式及其应用场景设计模式是软件工程中的重要概念,它提供了一种标准的、规范的方法来解决具有普遍性的问题。
在C++中,设计模式的应用有助于提高代码的可重用性、可维护性和灵活性。
本文将介绍几种常见的设计模式及其应用场景。
1. 单例模式(Singleton)应用场景:当某个类只能有一个实例,且该实例应自行创建时。
例如,系统中的日志记录器、配置管理器等。
2. 工厂模式(Factory)应用场景:当需要创建对象,但不希望在客户端代码中指定具体类时。
例如,游戏中的角色、装备等可以通过工厂模式来创建。
3. 观察者模式(Observer)应用场景:当一个对象的状态改变需要通知其他对象时。
例如,实时新闻应用中,当有新消息时,需要通知所有订阅了该频道的用户。
4. 策略模式(Strategy)应用场景:当算法可以独立于使用它的上下文而变化时。
例如,不同的排序算法可以在不同的场景中切换,以适应不同的性能需求。
5. 装饰器模式(Decorator)应用场景:当需要在运行时动态地给对象添加职责时。
例如,一个文件下载器可以动态地添加压缩、加密等功能。
6. 适配器模式(Adapter)应用场景:当需要将一个类的接口转换为客户端所期望的另一个接口时。
例如,将一个类的函数签名与另一个不兼容的接口匹配起来。
7. 迭代器模式(Iterator)应用场景:当需要遍历一个聚合对象而又不暴露其内部表示时。
例如,在处理链表、树等数据结构时,可以使用迭代器来遍历数据而不需要了解其内部实现细节。
总结:设计模式在C++编程中扮演着重要的角色,通过合理地运用设计模式,可以提高代码的可维护性、可扩展性和可重用性。
在实际开发中,应根据具体的需求和场景选择合适的设计模式来解决问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UML和设计模式
22
小结
工厂模式: 简单工厂 工厂方法 抽象工厂 单例模式
里氏代换原则
UML和设计模式
23
思考题
1. 工厂模式就是在不使用new操作符的情况下,将类
实例化吗?为什么在具体实现时仍然使用了new操 作符呢?
2. 为什么不使用一个静态的“全程”变量,而要建立
一个类呢?一个静态的全程变量当然只能有一个值 ,自然而然不就是“单例”的吗?
权 巍
主要内容
9.1 工厂模式(Factory) 9.2 单例模式( Singleton) 9.3 里氏代换原则
UML和设计模式
2
9.1 工厂模式
工厂模式是一种创建型模式。
工厂模式通过工厂来生成对象,这个工厂专门负责将
大量有共同接口的类实例化。这样,在增加新对象时 所要做的全部工作就是只修改该工厂,而不需修改散 布在程序各处的对象创建代码了。 工厂模式有三种形态:
简单工厂(Simple Factory)模式 工厂方法(Factory Method)模式 抽象工厂(Abstract Factory)模式
UML和设计模式
3
9.1.1 简单工厂模式
问题:实现根据传入的参数,动态决定创建哪个 类的实例。
一个农场的例子
UML和设计模式
4
简单工厂模式(静态工厂方法模式)
定义一个工厂类根据传入的参数决定创建出哪一种产
品类的实例。
UML和设计模式
5
简单工厂模式的三个角色: 工厂类角色
模式的核心,负责根据传入的参数决定创建出哪种 具体产品类的对象,通常为具体类。
抽象产品
由模式所创建的对象的父类,或它们共同拥有的接 口担任,可为抽象类或接口。
具体产品
模式所创建的任何对象都是这个角色的实例,为具 体类。
} }
UML和设计模式 12
// 客户端程序示例 class Client { public static void main(String[] args) { FruitGardener f1,f2; Fruit a, b, c; f1 = new AppleGardener(); f2 = new GrapeGardener (); //实例化2个苹果对象 a= f1. factory(); //稳定不变 b= f1. factory(); //实例化1个葡萄对象 c= f2. factory(); } }
UML和设计模式
17
农场例子—抽象工厂模式
UML和设计模式
18
9.2 单例模式( Singleton )
单例模式的意图:
保证一个类仅有一个实例,并提供一个该类实例的全 局访问点。
单例模式的特点
单例类只能有一个实例; 单例类必须自己创建自己的这个唯一的实例; 单例类必须给所有对象提供这一实例。
UML和设计模式
19
单例模式
私有的构造方法; 类型为单例类本身的静态变量; 获得单例类的唯一实例的方法(公有的)。
UML和设计模式
20
单例模式示意代码: public class Singleton { private static Singleton instance = null; //其它成员数据…… private Singleton() { } public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } }
UML和设计模式 13
9.1.3 抽象工厂模式
问题:经常需要创建一个新的系列,即产品族。 产品族(Product Family):是指功能相关联的
产品组成的家族。 每个产品族包含一些相互依赖的对象,这些对象 稳定不变。 抽象工厂模式的意图:向客户提供一个接口,使 得客户可以在不必指定产品的具体类型的情况下, 创建产品族中的全部产品对象。
UML和设计模式
14
抽象工厂模式类图结构
ProductA3
ConcreteFactory3 CreateProductA() CreateProductB() ProductB3
UML和设计模式
15
抽象工厂模式的角色
抽象工厂:负责给出具体工厂类必须实现的接口, 是模式的核心,与应用系统的逻辑无关。
UML和设计模式
24
思考题
3. David是一个初级软件设计师,经常使用X语言编写
程序。有一次,需要一个类来描述文件名,因此, David定义了一个类FileName。他认为FileName基 本上是X语言提供的String类型的特殊情况,因此, 他将FileName定义为String类的子类,并增加了一 些FileName所需的方法,如下图所示。 请使用里氏代换原则分 析这一做法是否正确。
具体工厂:实现抽象工厂接口,直接在客户端的
ห้องสมุดไป่ตู้
调用下创建产品实例。这个角色含有选择合适的 产品对象的逻辑,与应用系统的逻辑紧密相关。 抽象产品: 具体产品:
UML和设计模式
16
(3)抽象工厂模式
代码实例: 抽象工厂: FacilityFactory 具体工厂(对应产品族): IceFacilityFactory、 DesertFacilityFactory。 抽象产品: Road、 Building、 Sky 具体产品: IceRoad、DesertRoad、IceBuilding、 DesertBuilding、IceSky、DesertSky
客户程序:
// 创建一个Fruit对象 Fruit a= FruitGradener. factory (“apple”); Fruit b= FruitGradener. factory (“grape”);
UML和设计模式 7
简单工厂模式的优点:
① 设计简单,核心是工厂类。工厂类包含必要的逻辑 判断,根据外界给定的信息,决定创建何种产品对 象; ② 免除了客户端创建产品对象的责任,产品类的等级 结构的变化不会影响到客户端。
UML和设计模式 21
9.3 里氏代换原则
里氏代换原则(Liskov Substitution Principal,LSP)
的严格表达如下: 如果对每一个类型为T1的对象o1,都有类型为T2 的对象o2,使得以T1定义的所有程序P在所有的对象 o1都代换成o2时,程序P的行为没有变化,那么类型 T2是类型T1的子类型。 换言之,一个软件实体如果使用的是基类的话,那么 一定适用于其子类,而且它根本不能察觉出基类对象 和子类对象的区别。
UML和设计模式 6
示例代码(简单工厂):
//具体工厂: 是核心,负责创建具体产品 public class FruitGradener { public static Fruit factory (String name) { if(name.equals(“grape”)) return new Grape(); else if(name.equals(“apple”)) return new Apple(); else return new Strawberry(); } }
缺点:
① 增加新的产品类时,要修改工厂类,违反了面向对 象设计的基本原则。 ② 工厂类负责创建所有产品,一旦不能正常工作,整 个程序都会受到影响。
UML和设计模式 8
9.1.2工厂方法模式(多态性工厂模式)
问题:需要频繁增加新的对象 解决:封装变化点 (抽象的工厂)
UML和设计模式
9
(2)工厂方法模式(多态性工厂模式)
UML和设计模式 25
在工厂方法模式中,核心的工厂类不再负责所有 的产品的创建,而是将具体创建的工作交给子类去 做,即本模式中包含:抽象工厂、具体工厂。
抽象工厂:负责给出具体工厂类必须实现的接口。 具体工厂:实现抽象工厂接口,用于创建具体的
产品实例。
抽象产品
具体产品
UML和设计模式 10
农 场 例 子 工 厂 方 法 模 式
UML和设计模式 11
---
工 厂 方 法 模 式 代 码 实 例
//抽象工厂(稳定不变) interface FruitGardener{ public abstract Fruit factory(); } //railRoad、 sandRoad等对象的具体工厂 class AppleGardener implements FruitGardener{ public Fruit factory() { //…… return new Apple(); class Pear implements Fruit { …… } } } class GrapeGardener implements FruitGardener{ class PearGardener implements FruitGardener public Fruit factory() { { return new Grape(); public Fruit factory() { } return new Pear(); }