首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式:工厂方法模式

设计模式:工厂方法模式

作者头像
王强
发布于 2018-08-09 09:25:49
发布于 2018-08-09 09:25:49
53801
代码可运行
举报
文章被收录于专栏:Python爬虫实战Python爬虫实战
运行总次数:1
代码可运行

1 概述

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

2 图解

现在有A、B、C三种产品,相对应的有三个工厂:工厂A负责生产A产品,工厂B负责生产B产品,工厂C负责生产C产品。这时候客户不需要告诉工厂生产哪种产品了,只需要告诉对应的工厂生产就可以了。

图解工厂模式

工厂方法模式包含如下角色:

  • Factory 抽象工厂角色: 是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
  • ConcreteFactory 具体工厂角色(图中的FactoryA、FactoryB、FactoryC) 实现抽象工厂接口的具体工厂类,被应用程序调用以创建产品对象。
  • Product 抽象产品角色: 抽象产品角色是所创建所有对象的父类,负责描述所有实例的公共接口。
  • ConcreteProduct 具体产品角色(图中的ProductA、ProductB、ProductC): 实现了抽象产品角色所定义的接口 ,由专门的具体工厂角色创建。

3 优缺点

优点:

  • 子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。-- 加一层间接性,增加了灵活性
  • 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
  • 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
  • 多态性:客户代码可以做到与特定应用无关,适用于任何实体类。

缺点:

  • 添加新产品时,需要编写新的具体产品类 ,而且还要提供与之对应的具体工厂类,系统中类的将成对增加,在一定程度上增加了系统的复杂度。
  • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

4 应用场景

如果一个对象拥有很多子类,那么创建该对象的子类使用工厂模式是最合适的,不但可以面向接口的编程,为维护以及开发带来方便。

如果创建某个对象时需要进行许多额外的操作,如查询数据库然后将查询到的值赋予要创建的对象(单例初始化时使用比较多),或是需要许多额外的赋值等等。如果查看JDK源码中,会发现许多成员变量在对象构造时,通过工厂方法进行创建的。因为这些成员变量本身的创建也很复杂。不可能创建对象时,在该对象的构造方法里创建成员变量然后再赋值给该成员变量。而且使用工厂模式也提高了代码的重用性。

5 实例

FactoryMethodUml

5.1 C++实现

  • product.h
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef PRODUCT_H
#define PRODUCT_H

#include <iostream>

// 产品基类
class Product
{
public:
    Product() {}
    virtual ~Product(){}

    virtual void detail() const
    {
        std::cout << "This is the base class of product." << std::endl;
    }
};

// 产品A
class ProductA : public Product
{
public:
    ProductA() {}
    ~ProductA() {}

    virtual void detail() const
    {
        std::cout << "This is ProductA." << std::endl;
    }
};

// 产品B
class ProductB : public Product
{
public:
    ProductB() {}
    ~ProductB() {}

    virtual void detail() const
    {
        std::cout << "This is ProductB." << std::endl;
    }
};

// 产品C
class ProductC : public Product
{
public:
   ProductC() {}
   ~ProductC() {}

    virtual void detail() const
    {
        std::cout << "This is ProductC." << std::endl;
    }
};

#endif // PRODUCT_H
  • factory.h
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef FACTORY_H
#define FACTORY_H

#include "product.h"

// 工厂基类
class Factory
{
public:
    Factory(){}
    virtual ~Factory(){}

    static Product* produce()
    {
        return NULL;
    }
};

// 工厂A
class FactoryA : public Factory
{
public:
    FactoryA();
    virtual ~FactoryA();

    static Product* produce()
    {
        return new ProductA();
    }
};

// 工厂B
class FactoryB : public Factory
{
public:
    FactoryB();
    virtual ~FactoryB();

    static Product* produce()
    {
        return new ProductB();
    }
};

// 工厂C
class FactoryC : public Factory
{
public:
    FactoryC();
    virtual ~FactoryC();

    static Product* produce()
    {
        return new ProductC();
    }
};

#endif // FACTORY_H
  • main.cpp
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

#include "factory.h"

using namespace std;

int main()
{
    Product* productA = NULL;
    productA = FactoryA::produce();
    productA->detail();
    cout << "==============" << endl;

    Product* productB = NULL;
    productB = FactoryB::produce();
    productB->detail();
    cout << "==============" << endl;

    Product* productC = NULL;
    productC = FactoryC::produce();
    productC->detail();
    cout << "==============" << endl;

    delete productA;
    delete productB;
    delete productC;

    return 0;
}

运行结果

运行结果

5.2 Python实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#-*- coding: utf-8 -*-

'''
  工厂模式
'''

class Product:
    '''
    产品基类
    '''
    def detail(self):   
        print('This is the base class of produce')

class ProductA(Product):
    '''
    产品A
    '''
    def detail(self):   
        print('This is ProductA.')

class ProductB(Product):
    '''
    产品B
    '''
    def detail(self):   
        print('This is ProductB.')

class ProductC(Product):
    '''
    产品C
    '''
    def detail(self):   
        print('This is ProductC.')

class Factory:
    '''
    工厂类
    '''
    def produce(self):
        return None

class FactoryA(Factory):
    '''
    工厂A
    '''
    def produce(self):
        return ProductA()

class FactoryB(Factory):
    '''
    工厂B
    '''
    def produce(self):
        return ProductB()

class FactoryC(Factory):
    '''
    工厂C
    '''
    def produce(self):
        return ProductC()

def main():
    factoryA = FactoryA()
    productA = factoryA.produce()
    productA.detail()
    print('==================')
    factoryB = FactoryB()
    productB = factoryB.produce()
    productB.detail()
    print('==================')
    factoryC = FactoryC()
    productC = factoryC.produce()
    productC.detail()
    print('==================')

if __name__ == '__main__':
    main()

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C与Python实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
激活工具_MAS_1.3_Win10_CN.cmd
KMS_VL_ALL_AIO,批处理激活脚本智能解决方案,用于受支持的Windows、Office 产品激活。智能KMS激活模式KMS38激活至2038年、在线KMS激活180天,激活不覆盖产品的永久激活,支持自动续期激活,Office零售版本转批量版,Office C2R 的自动许可证转换等,AIO 是传统版的升级版,绿色便携式多合一。
张旭博客
2022/12/27
1.4K0
激活工具_MAS_1.3_Win10_CN.cmd
又来一款开源免费的Win/Office激活项目,牛逼~~
在日常生活和工作中,Windows和Office是我们经常使用的两款软件。然而,它们的正版授权费用并不便宜,这让很多用户望而却步。虽然市面上有很多免费的激活工具,但这些工具往往存在病毒、后门等安全隐患。
永恒君
2025/01/08
1.6K0
又来一款开源免费的Win/Office激活项目,牛逼~~
HEU KMS Activator v27.0.2 官方版(电脑系统全能激活器)
HEU KMS Activator,简洁高效的KMS/OEM智能激活工具,适用所有Windows, Office版本,无需联网即可一键激活,支持UEFI的KMS激活工具。KMS服务是微软对Windows, Office等产品的批量许可服务,利用KMS可以激活局域网内的产品。该工具利用KMS机制在系统搭建KMS服务器,从而实现在线或离线激活。
零点
2023/03/03
11.7K0
HEU KMS Activator v27.0.2 官方版(电脑系统全能激活器)
Windows + office 激活的123
之前课代表发过一篇系统下载和一篇安装系统的教程,经常有人问,这个系统要怎么激活呢?其实安装教程里面是有的,只不过有人没看,也有人试了发现不适合自己的电脑,所以今天特意说明,顺便把Office的激活放在一起。
课代表
2018/08/17
4.5K0
Windows + office 激活的123
KMS激活工具
---- layout: default title: KMS激活工具 category: [技术, 破解] comments: true --- 工具介绍 KMS_VL_ALL,国外MDL论坛的一款KMS激活工具,可自动识别需要激活的Windows以及Office的VL版本,无需联网即可全自动检测激活,支持创建自动续期计划,相比于国外的同类工具,体积小、代码开源/简洁、操作简单、无残留文件经众多网友测试推荐,此脚本激活成功率非常高。版本更新只v7.0 功能简介 支持激活Windows、Office
@坤的
2018/06/04
7.6K0
KMS激活服务器
密钥 https://docs.microsoft.com/zh-cn/windows-server/get-started/kmsclientkeys
Qicloud
2022/01/27
4.5K0
win10 、server 2019、office 2019激活
https://docs.microsoft.com/zh-cn/windows-server/get-started/kmsclientkeys
Windows技术交流
2020/04/06
12.6K0
Office365安装激活图文教程
建议下载包含框架的版本,比较方便。 成功下载之后解压打开软件。 (以下将 Office Tool Plus 简写为 otools)
MUKAPP
2022/11/28
22.9K2
Office365安装激活图文教程
Windows激活工具Office 激活工具HEU KMS Activator下载使用教程
Windows操作系统是由微软公司开发的一款计算机操作系统。自1985年发布以来,Windows操作系统成为了全球最受欢迎的操作系统之一,被广泛应用于个人电脑、笔记本电脑、服务器等各种计算机设备。
用户10519170
2023/04/21
5.6K0
Windows 10 Business Editions 专业版在线激活密钥以及 Microsoft Office 激活方法以及查看激活到期时间是否永久激活
最新教程: 数字权利激活工具 HWIDGen 的使用教程,一劳永逸的 Win10 完美激活,再也不怕重装系统了 - https://blog.error.work/windows/133.html
王图思睿
2021/06/15
7.8K0
Windows 10 Business Editions 专业版在线激活密钥以及 Microsoft Office 激活方法以及查看激活到期时间是否永久激活
Build your own X:从零开始创造自己的技术项目 | 开源日报 No.56
Build your own X 是一个集合了多个精心编写的、逐步指导你从零开始创建自己喜欢的技术项目的开源教程。这是学习编程的绝佳方式。
小柒
2023/10/23
1.2K0
Build your own X:从零开始创造自己的技术项目 | 开源日报 No.56
系统激活小工具可激活win7-win8-win10
杨小杰以前分享过安装系统的教程,现在分享一下激活工具,请勿做非法使用(低调使用)! 一款无需联网即可激活Windows 10、Windows 8.1、Windows 8、Windows 7(企业版/专业版)、Office 2013 (VL版)、Office 2010(VL版)的工具。其为单一可执行的绿色工具,使用完毕后对系统无任何残留,可以直接删除。此工具为知彼而知己原创工具,根据网友的使用要求及问题反馈进行更新,最新版修复了已知bug,并兼容Windows XP至Windows 10,可以直接使用无
Youngxj
2018/06/07
3.3K2
【工具】Windows和Office激活——HEU_KMS_Activator
这篇文章介绍了Windows和Office的批量激活方法,即KMS,以及其有效期为180天。为了解决没有激活码无法使用Office的问题,出现了HEU_KMS_Activator工具,它能智能识别最佳的激活方式。如果Windows或Office已永久激活,则自动跳过。在无法激活的情况下,最后会采取KMS激活180天。文章还提到了该工具的一些功能,如密钥管理和更换Windows版本等。
用户10984773
2025/07/03
4.8K0
【工具】Windows和Office激活——HEU_KMS_Activator
一键安装KMS服务脚本 win系统正版激活脚本
KMS,是 Key Management System 缩写,也就是密钥管理系统。这里所说的就是用来激活 VOL 版本 Windows 和 Office 的 KMS。经常能在网上看到有人提供 KMS 服务器地址,那么你有没有想过自己也来搞一个这样的服务呢?而这样的服务在 Github 上已经有开源代码实现了。
雾海梦曦
2022/11/12
1.7K0
一键安装KMS服务脚本 win系统正版激活脚本
群晖NAS利用Docker容器搭建KMS激活服务器实现激活windows系统和office
Windows系统中能够通过KMS进行激活的一般称为VL版,即VOLUME授权版。我们可以自行搭建KMS激活服务器,实现每180天一次的自动激活,使得系统一直保持激活状态。这次就跟大家分享一下如何利用群晖NAS的Docker容器套件搭建KMS服务器,并演示如何利用我们自己的KMS服务器激活Windows操作系统与Microsoft Office。
zeruns
2020/03/23
17.1K0
超详细!安装与激活Office 2010 2012 2020 365
Office Tool Plus是一款好用的Office部署软件,可以帮助我们快速部署Microsoft Office软件,本文将使用Office Tool Plus来演示如何安装激活Office 365。
叼同学
2021/08/09
7.7K0
超详细!安装与激活Office 2010 2012 2020 365
如何使用kms工具激活vol版本的Windows和Office
相信在座的各位白嫖党都想用到正版的Windows系统和正版的Office套装,市面上大多数的方案是从淘宝花几块钱买个数字激活码激活和用盗版的激活工具,有什么方法才能让我们用到名正言顺的正版呢?还真有,那就是kms激活。
tyrantlucifer
2022/03/23
4.6K0
适用于windows && office 可用kms服务器激活地址汇总
是一款支持Office2013,Office2016,Win7,Win8,Win10的本地离线激活工具
Khan安全团队
2022/01/27
109.1K2
适用于windows && office 可用kms服务器激活地址汇总
威联通NAS搭建KMS激活服务器实现激活windows系统和office
威联通NAS利用Container Station容器管理器中的Docker搭建KMS激活服务器实现激活windows系统和office
zeruns
2021/04/09
8.2K0
Windows10永久激活工具,告别180天!
哈喽!各位小伙伴大家好呀!虽说windows11已经上线大半年的时间了,但是升级率却并不高,windows10依然是主力军。
简单并不简单
2022/08/30
4.3K0
Windows10永久激活工具,告别180天!
推荐阅读
相关推荐
激活工具_MAS_1.3_Win10_CN.cmd
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档