`
kmakxa
  • 浏览: 14981 次
社区版块
存档分类
最新评论

设计模式阅读笔记(4)-----------工厂模式

 
阅读更多

有些开发人员会把简单工厂认为是工厂模式,其实并不是,简单工厂是种习惯。这种做法是将类的实例化任务交予了其他类来实现,避免在代码中用new初始化类。

如图是简单工厂的使用:

这样,User在使用Product的时候不用去new一个相应的Product类型,而是调用ProductFactory的createProduct方法来获得一个Product实例。那这种方法相比我们去使用new来创建实例有什么好处呢?这里要提到一个设计原则,对修改关闭,将容易改变的代码抽离。User的目的是使用Product,那如果当product产生变化,比如新增了一种类型的product的时候,如果我们是在User中使用new新建实例,我们就需要进入User类中对代码进行修改,这样User就没有做到对修改关闭,更加可怕的是增加product的人可能根本不知道有哪些User需要修改。因此简单工厂可以将实例化部分抽出,给User的useProduct方法增加一个productType参数,就可以创建所需要的product。

下面才是工厂方法模式

定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到了子类。

根据定义我们就可以看出,该模式使用方法来实现了工厂的功能。

为什么会有这种需要呢?或者说,简单工厂有什么不足的地方?我们假设有这种场景,出现了两种类型的用户,他们要使用不同系列的产品,两系列的产品略有不同。在这种情况下,ProductFactory并不能限制产出的产品,UserA,UserB都要改写useProduct来实现功能。这样导致了useProduct方法没能复用,而且本身useProduct的功能就是要执行product的productAction方法而已,不应该关注使用的是哪种产品,根据面向接口原则,这样是不好的。

因为子类才需要决定实例化的类是哪个,所以父类是不需要知道这个的,我们在父类添加了虚函数 createProduct 来代替ProductFactory的功能,注意,父类是不用实现这个方法的,子类才进行实现。createProduct方法返回需要的Product类来使用。

工厂方法模式如图:


其中User和Product类是很多个的,但是画出来会很乱。这样编写的useProduct方法可以复用。User作为子类,必须实现相应的createProduct方法来决定要生成哪些Product。

这里就要提到依赖倒置原则,要依赖抽象,不要依赖具体类。那工厂方法模式哪里体现到了这个原则呢?按我们正常的设计来说,用户要使用各种各样的产品,那么不同用户就会依赖于各种产品。将产品抽象出一个产品接口,那么各种产品就依赖于产品接口,用户也依赖产品接口,这样依赖就倒置了。【这是根据书上总结来的,但是我个人是不怎么理解的】

在这里我产生了疑惑,既然说要针对接口编程而不是针对实现编程,可是我们在User类的createProuct中依然实例化了相应的product,这是不是有问题呢?

抽象工厂模式看上去解决了这种问题,我现在也还没明白这两种的优缺点,不使用抽象工厂而用工厂方法的情况是怎么样的。

按我理解,抽象方法就是讲工厂方法抽取出来,到工厂接口中,再由工厂实现类来决定实例化产品。

入图所示:

其中Product可以是多系列的,如果增加一个系列的话,可以在抽象工厂中添加新的工厂方法。

分享到:
评论

相关推荐

    《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码

    《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码

    设计模式学习笔记--Flyweight享元模式.docx

    享元模式是一种设计模式,属于构造型模式,其主要目的是减少对象的数量,通过共享大量相似对象的内部状态来节省内存。这种模式在处理大量细粒度对象时特别有用,能够有效地提高系统的性能。 享元模式的核心是...

    设计模式学习笔记(一)--简单工厂模式源码

    在这个学习笔记中,我们将深入理解简单工厂模式的概念、工作原理以及如何在实际编程中应用。 简单工厂模式的核心思想是通过一个公共的工厂类来创建不同类型的对象。这个工厂类负责识别客户端请求的对象类型,并返回...

    Java 版设计模式学习笔记-java-design-patterns.zip

    这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...

    韩顺平_Java设计模式笔记.docx

    ### 韩顺平_Java设计模式笔记知识点详解 #### 1. Java设计模式内容介绍 ##### 1.1.1 先看几个经典的面试题 - **原型设计模式问题** - **UML类图**:原型模式的核心在于定义了一个`Prototype`接口,该接口声明了...

    《设计模式学习笔记》

    《设计模式学习笔记》主要探讨了GOF的23种设计模式以及类设计的基本原则,旨在帮助开发者理解和应用这些经过时间验证的成熟解决方案。...再次阅读设计模式的笔记,旨在深化理解,发掘设计模式在实际开发中的真正价值。

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    尚硅谷设计模式源码笔记课件.zip

    共150讲,时长共 33...1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括...

    设计模式笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。

    自己总结的设计模式笔记

    设计模式笔记 设计模式是软件开发中常用的解决方案,能够提高代码的灵活性、可维护性和可扩展性。以下是设计模式的七大原则和两种常用的创建型设计模式。 1. "开-闭"原则 "开-闭"原则是设计模式的核心原则,指...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    学习笔记-深入浅出设计模式

    在《深入浅出设计模式》的学习笔记中,我们可以看到几种关键的设计模式及其应用,包括策略模式、观察者模式、装饰者模式、工厂模式和抽象工厂模式。 1. **策略模式**: - 策略模式的核心在于将算法族封装在独立的...

    设计模式复习笔记大全

    ### 设计模式复习笔记大全 #### 一、设计模式概览 **设计模式**是一种用于在特定场景下解决常见设计问题的方案。它通常描述了一组相互作用的类和对象,以及这些对象如何通信来解决问题。设计模式的核心要素包括...

    设计模式读书笔记

    创建型设计模式关注的是对象的创建,如工厂方法、抽象工厂、建造者、原型和单例模式,它们分别处理不同程度的对象创建延迟和实例化过程。结构型模式则涉及如何组合类和对象,包括适配器、桥接、组合、装饰器、外观、...

    23个设计模式图解--学习笔记

    在《23个设计模式图解--学习笔记》中,我们探讨了这些模式,以便于理解和应用到实际开发中。以下是这23个设计模式的详细说明: 1. **工厂方法**(Factory Method):定义一个用于创建对象的接口,让子类决定实例化...

    Java设计模式学习笔记.pdf

    在学习Java设计模式时,掌握其概念、应用、优点和缺点非常重要。设计模式是软件开发中经常使用的一种通用解决方案模板,用于解决特定上下文中的常见问题。它们源于设计模式的研究,通常被认为是软件设计中的最佳实践...

    Head First设计模式读书笔记-DesignPatterns.zip

    4. **装饰器模式**:结构型设计模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。比如,我们可以在不修改原有类的基础上,为对象添加新的行为或属性。 5. **代理模式**:结构...

    《C++20设计模式》学习笔记-第2章构造器模式学习代码

    在C++编程中,设计模式是一种经过验证的解决常见问题的最佳实践。《C++20设计模式》一书深入探讨了如何在C++20这一最新标准中应用这些模式。第2章着重讲解了构造器模式,这是一种创建型设计模式,它关注的是对象的...

Global site tag (gtag.js) - Google Analytics