案例分析:设计模式与代码的结构特性——工厂方法模式

什么是工厂方法模式

  工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。工厂方法(Factory Method)模式定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

  工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

工厂方法模式的特点

工厂方法模式优点
(1)在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无需知道具体产品类的类名。
(2)基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,正是因为所有的具体工厂类都具有同一抽象父类。
(3)使用工厂方法模式的另一个优点是在系统中加入新产品时无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,只需要添加一个具体工厂和具体产品即可,这样系统的可扩展性也就变得非常好,完全符合开闭原则。

工厂方法模式缺点
(1)在添加新产品时需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
(2)由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度。


工厂方法模式适用环境
(1)客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。
(2)抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时子类对象将覆盖父类对象,从而使得系统更容易扩展。

工厂方法模式的结构

UML类图

成员组成

组成(角色) 关系 作用
抽象产品 具体产品的父类 描述具体产品的公共接口
具体产品 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
抽象工厂 具体工厂的父类 描述具体工厂的公共接口
具体工厂 抽象工厂的子类;被外界调用 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

工厂方法模式的具体实现
背景:现在有一个运算器只能进行加法运算,现在有不同的客户需要不同的运算,如乘法,减法,除法等等,如果重新构造乘法运算器、除法运算器、减法运算器无疑使代码太过于松散而且冗杂,现在引入工厂方法模式,在原有的运算工厂下开发出新的计算方法。

UML图

关键代码:

计算器工厂:

/*
 * 工厂接口
 */
interface Calculator {
    Operation createOperation();
}

  

加法工厂:

/*
 * 加法操作工厂
 */
class Addop implements Calculator {
    public Operation createOperation() {
        return new OperationAdd();
    }
}

  

减法工厂:

/*
 * 减法操作工厂
 */
class Minusop implements Calculator {
    public Operation createOperation() {
        return new OperationMinus();
    }
}

  

乘法工厂:

/*
 * 乘法操作工厂
 */
class Multiop implements Calculator {
    public Operation createOperation() {
        return new OperationMul();
    }
}

  

除法工厂:

/*
 * 除法操作工厂
 */
class Divop implements Calculator {
    public Operation createOperation() {
        return new OperationDiv();
    }
}

  

操作接口:

abstract class Operation {
    public abstract int getResult(int a, int b);
}

  

加法操作:

/*
 * 加法操作
 */
class OperationAdd extends Operation {
    public int getResult(int a, int b) {
        return a + b;
    }
}

  

减法操作:

/*
 * 减法操作
 */
class OperationMinus extends Operation {
    public int getResult(int a, int b) {
        return a - b;
    }
}

  

乘法操作:

/*
 * 乘法操作
 */
class OperationMul extends Operation {
    public int getResult(int a, int b) {
        return a * b;
    }
}

  

除法操作:

/*
 * 除法操作
 */
class OperationDiv extends Operation {
    public int getResult(int a, int b) {
        return a / b;
    }
}

  

完整代码:

https://github.com/Liwj57/factorymethod

原文地址:https://www.cnblogs.com/Liwj57csseblog/p/12001747.html

时间: 2024-10-09 11:36:42

案例分析:设计模式与代码的结构特性——工厂方法模式的相关文章

完整案例分析再加知识整合——艾特工厂方法模式,超详细的

工厂方法模式 模式动机与定义 模式动机 模式定义 工厂方法模式(Factory Method Pattern)简称工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式. 在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类. 模式结构与分析 模式结构 工厂

java/android 设计模式学习笔记(3)---工厂方法模式

这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或取得对象的初始设置:选择生成哪个子对象实例:或在生成你需要的对象之前必须先生成一些辅助功能的对象,这个时候就需要了解该对象创建的细节,也就是说使用的地方与该对象的实现耦合在了一起,不利于扩展,为了解决这个问题就需要用到我们的工厂方法模式,它适合那些创建复杂的对象的场景,工厂方法模式也是一个使用频率很

设计模式与代码的结构特性

1. 根据目的来分 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式.结构型模式和行为型模式 3 种. 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”.GoF 中提供了单例.原型.工厂方法.抽象工厂.建造者等 5 种创建型模式. 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理.适配器.桥接.装饰.外观.享元.组合等 7 种结构型模式. 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及

案例分析:设计模式与代码的结构特性

我要分析的是一个Java框架 RxJava,他是一个在 Java VM 上使用可观测的序列来组成异步的.基于事件的程序的库,它能够方便的实现Java的异步操作. 代码仓库:https://github.com/ReactiveX/RxJava RxJava使用观察者模式,当我们需要使用异步操作时就发送一个数据流,订阅者这个时候被调用去处理异步操作. 最简单的异步操作如上,通过Subscribe方式注册.观察者模式面向的需求是:A 对象(观察者)对 B 对象(被观察者)的某种变化高度敏感,需要在

设计模式之(Factory method)工厂方法模式

1.需求 开发一个测试工具专门用于测试手机,测试流程打开分为以下几步:测试开机速度->测试屏幕亮度->测试相机效果.手机有很多种品牌:三星.小米.魅族等等. 2. 分析 不同的手机的测试流程是一样的.我们可以将不变的测试流程和具体的手机隔离起来,当需要检测新的品牌的手机的时候,不需要更改测试流程,只要添加一个手机就行了. 3.类图

大话设计模式C++实现-第8章-工厂方法模式

一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2)详细工厂 (3)抽象产品 (4)详细产品 四.优势 (1)工厂方法模式是对简单工厂模式的略微的改进.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中. (2)与简单工厂模式相比,制造产品的工厂类不再 仅仅有一个.而是每种详细产品类都相应一个生产它的详细工厂类. 而这些详细

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

(转)设计模式(五)简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和