千家信息网

设计模式之什么是工厂模式

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇内容主要讲解"设计模式之什么是工厂模式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"设计模式之什么是工厂模式"吧!01 简单工厂方法简单工厂方法可能是
千家信息网最后更新 2025年02月01日设计模式之什么是工厂模式

本篇内容主要讲解"设计模式之什么是工厂模式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"设计模式之什么是工厂模式"吧!

01 简单工厂方法

简单工厂方法可能是最常见的工厂类创建型模式了,其中有几个角色,一个是抽象产品角色,一个是具体产品角色,多个具体产品都可以。抽象成同一个抽象产品。拿操作系统举例,操作系统作为一个抽象产品,它有几种具体产品角色,有Windows操作系统,有Android操作系统,有iOS操作系统。有一个操作系统的工厂,工厂可以根据不同的需求生产出不同内核的操作系统,这个操作系统的工厂就是最后一个角色:工厂角色。

#include   enum class BallEnum { BasketBall = 1, SocketBall = 2 };  class Ball { public:    Ball() {}    virtual ~Ball() {}  virtual void Play() {} };  class BasketBall : public Ball { public:     void Play() override { std::cout << "play basketball \n"; } };  class SocketBall : public Ball { public:   void Play() override { std::cout << "play socketball \n"; } };  class SimpleFactory { public:   static Ball* CreateBall(BallEnum type); };  Ball* SimpleFactory::CreateBall(BallEnum type) {   switch (type) {     case BallEnum::BasketBall:       return new BasketBall();     case BallEnum::SocketBall:       return new SocketBall();   }   return nullptr; }  int main() {    Ball* basket = SimpleFactory::CreateBall(BallEnum::BasketBall);    basket->Play();    Ball* socket = SimpleFactory::CreateBall(BallEnum::SocketBall);    socket->Play();    return 0; }

在简单工厂方法中,有一个专门的工厂类,根据不同的参数返回不同具体产品类的实例,这些具体产品可以抽象出同一个抽象产品,即有一个共同的父类。 通过上述代码您可能也看到了简单工厂方法的优点,实现了对象的创建和使用逻辑分离,只需要传入不同参数,就可以获得特定具体类的实例。但简单工厂方法也有些缺点,当增加了新的产品,就需要修改工厂类的创建逻辑,如果产品类型较多,就可能造成工厂类逻辑过于复杂,不利于系统的维护,适用于具体产品类型比较少并且以后基本不会新加类型的场景,这样工厂类业务逻辑不会太过复杂。

02 工厂方法模式

为了解决上面简单工厂方法模式的缺点,进一步抽象出了工厂方法模式,工厂类不再负责所有产品的构建,每一个具体产品都有一个对应的工厂,这样在新加产品时就不会改动已有工厂类的创建逻辑。这些工厂也会抽象出一个抽象工厂。可以理解为有四种角色,抽象产品,具体产品,抽象工厂,具体工厂,其实就是把简单工厂模式中的工厂类做进一步抽象,看代码吧:

#include   enum class BallEnum { BasketBall = 1, SocketBall = 2 };  class Ball {   public:    Ball() {}    virtual ~Ball() {}     virtual void Play() {} };  class BasketBall : public Ball {   public:    void Play() override { std::cout << "play basketball \n"; } };  class SocketBall : public Ball {   public:    void Play() override { std::cout << "play socketball \n"; } };  class FactoryBase {   public:    virtual ~FactoryBase() {}    virtual Ball* CreateBall() = 0; };  class BasketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new BasketBall(); } };  class SocketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new SocketBall(); } };  int main() {    FactoryBase* factory;    BallEnum ball_type = BallEnum::SocketBall;    switch (ball_type) {        case BallEnum::BasketBall:            factory = new BasketBallFactory();            break;        case BallEnum::SocketBall:            factory = new SocketBallFactory();            break;   }    Ball* ball = factory->CreateBall();    ball->Play();    return 0; }

工厂模式提高了系统的可扩展性,完全符合开闭原则,当新加具体产品时,完全不会对已有系统有任何修改。当不知道以后会有多少具体产品时可以考虑使用工厂模式,因为不会降低现有系统的稳定性。但是它也有缺点,每当新加一个产品时,不仅需要新加一个对应的产品类,同时还需要新加一个此产品对应的工厂,系统的复杂度比较高。怎么解决呢,可以再抽象一下:

03 抽象工厂模式

在工厂方法中,每一个抽象产品都会有一个抽象工厂,这样新增一个产品时都会新增两个类,一个是具体产品类,一个是具体工厂类,我们可以考虑多个抽象产品对应一个抽象工厂,这样可以有效减少具体工厂类的个数,见如下代码:

#include   enum class BallEnum { BasketBall = 1, SocketBall = 2 };  class Ball {   public:    Ball() {}    virtual ~Ball() {}     virtual void Play() {} };  class BasketBall : public Ball {   public:    void Play() override { std::cout << "play basketball \n"; } };  class SocketBall : public Ball {   public:    void Play() override { std::cout << "play socketball \n"; } };  class Player {   public:    Player() {}    virtual ~Player() {}    virtual void Name() {} };  class BasketBallPlayer : public Player {   public:    void Name() override { std::cout << "BasketBall player \n"; } };  class SocketBallPlayer : public Player {   public:    void Name() override { std::cout << "SocketBall player \n"; } };  class FactoryBase {   public:    virtual ~FactoryBase() {}    virtual Ball* CreateBall() = 0;    virtual Player* CreatePlayer() = 0; };  class BasketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new BasketBall(); }    Player* CreatePlayer() override { return new BasketBallPlayer(); } };  class SocketBallFactory : public FactoryBase {   public:    Ball* CreateBall() override { return new SocketBall(); }    Player* CreatePlayer() override { return new SocketBallPlayer(); } };  int main() {    FactoryBase* factory;    BallEnum ball_type = BallEnum::SocketBall;    switch (ball_type) {        case BallEnum::BasketBall:            factory = new BasketBallFactory();            break;        case BallEnum::SocketBall:            factory = new SocketBallFactory();            break;   }    Ball* ball = factory->CreateBall();    Player* player = factory->CreatePlayer();    ball->Play();    player->Name();    return 0; }

到此,相信大家对"设计模式之什么是工厂模式"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

工厂 产品 模式 系统 方法 操作系统 角色 不同 逻辑 设计模式 设计 复杂 代码 品类 类型 缺点 内容 参数 多个 实例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全班会课 sql数据库实例已使用 电视机服务器无法连接怎么办 新一代网络技术产业培育方案原文 魔域怎么查角色在哪个服务器 邮件服务器挂在公网安全 临汾网络安全工程师招聘 代码输入图片进数据库 网络技术公司合同书样本 数据库技术 认证 wimdows服务器管理工具 直发发型设计软件开发 珠海塑胶模具erp软件开发 网络技术三级考试介绍 软件开发用的手提电脑需要多少钱 滴滴软件开发策化书 数据库出生年月怎么设置 合肥几度互联网络科技 服务器硬盘坏了能克隆吗 百卓网络技术有限公司6 软件开发学哪个专业好 服务器线路错误 如何查看服务器ftp协议端口 西安回收报废服务器 数据包与网络数据库成本对比 整点报时软件开发 网络安全为人民宣传画小学图片 河北天驱企业级服务器云服务器 纪守领浙江大学网络安全 网络安全应该如何防范
0