1.1概述
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。这就是工厂方法模式的定义。
得到一个类的子类的实例最常用的办法就是使用new运算符和该子类的构造方法,但是在某些情况下,用户可能不应该或无法使用这种办法来得到一个子类的实例,其原因是系统不允许用户代码和该类的子类形成耦合或者用户不知道该类有哪些子类可用。
例如,有一个笔芯类(PenCore),该类是一个抽象类。假设笔芯类有三个子类,分别是红笔芯类(RedPenCore)、蓝笔芯类(BluePenCore)、黑笔芯类(BlackPenCore),而系统设计的目的是为用户提供圆珠笔类(BallPen)的子类的实例,即含有笔芯的圆珠笔,也就是说系统想让用户使用圆珠笔类的子类的实例来得到笔芯类的子类的实例。
为此,在设计圆珠笔类的同时,决定让它依赖于笔芯类,并且提供了一个返回笔芯类对象的方法,比如:PenCore getPenCore();
但是圆珠笔类本身并不知道用户需要哪种颜色的笔芯,即不知道用户需要笔芯类的哪个子类的实例,因此圆珠笔类将getPenCore()方法设置为抽象方法,并将自己设置为抽象类,要求其子类重写(覆盖)getPenCore()方法,并使用getPenCore()方法返回笔芯类的一个特定子类的实例。比如,当用户需要蓝笔芯类的实例时,就不需要使用new运行符和蓝笔芯类的构造方法来来创建对象,代替地使用蓝笔芯类创建一个对象,该对象调用getPenCore()方法就可以为用户获得一个蓝笔芯类的实例,用户可以让这个实例调用有关方法写出蓝色的字了。具体示意类图如下图一所示:
图一:圆珠笔与笔芯示意类图
当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
1.2模式的结构
工厂方法模式结构包括四种角色:
(1)抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法;
(2)具体产品(ConcreteProduct):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品是实现Product接口的类;
(3)构造者(Creator):一个接口或抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
(4)具体构造者(COncreteCreator):如果构造者是一个抽象类,那么具体构造者就是构造者的子类;如果构造者是一个接口,那么具体构造者就是实现构造者接口的类。具体构造者重写工厂方法使该方法返回具体产品的实例。
工厂方法模式结构的类图如下图二所示:
图二:工厂方法模式的类图
1.3工厂方法模式的优点
(1)使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。
(2)工厂方法使用用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。
1.4适合使用工厂方法模式的情景
(1)用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
(2)用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。
1.5工厂方法模式的使用
下面通过一个简单的实例,实现1.1概述中简单例子,具体如下:
首先看一下本实例构建框架具体类和1.2模式的结构中类图的对应关系,如下图3所示:
图3 具体编写类与类图对应关系
(1)抽象产品(Product)
在1.1概述中提到的PenCore类是模式中的Product角色,PenCore类的代码如下:
package com.liuzhen.ten_factory; public abstract class PenCore { String color; public abstract void writeWord(String s); }
(2)具体产品(ConcreteProduct)
在1.1概述中提到的RedPenCore、BluePenCore和BlackPenCore类是三个具体产品角色,代码如下:
RedPenCore.java类
package com.liuzhen.ten_factory; public class RedPenCore extends PenCore{ RedPenCore(){ color = "红色"; } public void writeWord(String s){ System.out.println("写出"+color+"的字:"+s); } }
BluePenCore.java类
package com.liuzhen.ten_factory; public class BluePenCore extends PenCore{ BluePenCore(){ color = "蓝色"; } public void writeWord(String s){ System.out.println("写出"+color+"的字:"+s); } }
BlackPenCore.java类
package com.liuzhen.ten_factory; public class BlackPenCore extends PenCore{ BlackPenCore(){ color = "黑色"; } public void writeWord(String s){ System.out.println("写出"+color+"的字:"+s); } }
(3)构造者(Creator)
在1.1概述中提到的BallPen类是构造者角色,代码如下:
package com.liuzhen.ten_factory; public abstract class BallPen { BallPen(){ System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔"); } public abstract PenCore getPenCore(); //工厂方法 }
(4)具体构造和(ConcreteCreator)
在1.1概述中提到的RedBallPen、BlueBallPen、BlackBallPen类是具体构造者角色,代码如下:
RedBallPen.java类
package com.liuzhen.ten_factory; public class RedBallPen extends BallPen{ public PenCore getPenCore(){ return new RedPenCore(); } }
BlueBallPen.java类
package com.liuzhen.ten_factory; public class BlueBallPen extends BallPen{ public PenCore getPenCore(){ return new BluePenCore(); } }
BlackBallPen.java类
package com.liuzhen.ten_factory; public class BlackBallPen extends BallPen{ public PenCore getPenCore(){ return new BlackPenCore(); } }
(5)具体使用
通过TenApplication类来具体实现上述相关类,来实现工厂方法模式的运用,其代码如下:
package com.liuzhen.ten_factory; public class TenApplication { public static void main(String args[]){ PenCore penCore; BallPen ballPen = new BlueBallPen(); penCore = ballPen.getPenCore(); penCore.writeWord("您好,很高兴认识你"); ballPen = new RedBallPen(); penCore = ballPen.getPenCore(); penCore.writeWord("How are you"); ballPen = new BlackBallPen(); penCore = ballPen.getPenCore(); penCore.writeWord("nice to meet you"); } }
运行结果如下:
生产了一只装有蓝色笔芯的圆珠笔
写出蓝色的字:您好,很高兴认识你
生产了一只装有红色笔芯的圆珠笔
写出红色的字:How are you
生产了一只装有黑色笔芯的圆珠笔
写出黑色的字:nice to meet you
相关推荐
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...
《设计模式学习笔记》主要探讨了GOF的23种设计模式以及类设计的基本原则,旨在帮助开发者理解和应用这些经过时间验证的成熟解决方案。设计模式是面向对象软件设计中的核心概念,它们为解决常见的设计问题提供了标准...
这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...
《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...
以下是对“C#设计模式学习笔记”中涉及的一些关键知识点的详细解释。 1. **设计模式的基本概念**: 设计模式是一种在特定上下文中已被证明有效的解决方案模板,它描述了如何在软件设计中解决常见问题。设计模式...
2. 抽象工厂模式:提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类。 3. 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 4. 原型模式:通过复制现有...
在这个学习笔记中,我们将深入理解简单工厂模式的概念、工作原理以及如何在实际编程中应用。 简单工厂模式的核心思想是通过一个公共的工厂类来创建不同类型的对象。这个工厂类负责识别客户端请求的对象类型,并返回...
这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...
共150讲,时长共 33...1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括...
### Head.First 设计模式学习笔记知识点总结 #### 一、设计模式概述 设计模式是一种用于解决软件设计中常见问题的标准化方法。通过采用设计模式,开发者可以提高代码的复用性、灵活性和可维护性。《Head First 设计...
设计模式的学习不仅帮助我们编写更可维护、可扩展的代码,还能提高团队间的沟通效率,因为它们提供了通用的语言和解决方案。在实际开发中,灵活运用这些设计模式可以有效解决设计问题,提升代码质量。因此,深入理解...
《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码
"GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...
简单工厂模式、工厂方法模式和抽象工厂模式是其三种主要形式。 3. **抽象工厂模式**:在工厂模式的基础上更进一步,允许创建一系列相关的对象家族,而无需明确指定它们的具体类。 4. **构造器模式**(也称为建造者...
在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...