GoF 23种经典的设计模式——工厂模式

工厂模式

工厂模式是一种创建型设计模式,它提供了一种封装对象创建过程的方式。在工厂模式中,我们将对象的实例化过程移到一个独立的工厂类中,客户端通过调用工厂类的方法来创建对象,而不是直接使用 new 关键字实例化对象。
在这里插入图片描述

工厂模式有多种变体,其中最常见的是简单工厂模式、工厂方法模式和抽象工厂模式。

假设我们有一个图形类 Shape,它有两个派生类 CircleRectangle。我们使用工厂模式来创建这些图形对象。

首先,我们定义一个抽象的基类 Shape,它声明了一个纯虚函数 draw()

class Shape {
public:
    virtual void draw() = 0;
};

然后,我们创建两个派生类 CircleRectangle,它们实现了 draw() 函数:

class Circle : public Shape {
public:
    void draw() {
        cout << "Drawing a circle." << endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() {
        cout << "Drawing a rectangle." << endl;
    }
};

接下来,我们定义一个工厂类 ShapeFactory,它根据客户端传入的参数创建相应的图形对象:

class ShapeFactory {
public:
    Shape* createShape(string type) {
        if (type == "circle") {
            return new Circle();
        } else if (type == "rectangle") {
            return new Rectangle();
        } else {
            return nullptr;
        }
    }
};

最后,我们可以在客户端代码中使用工厂类来创建图形对象:

int main() {
    ShapeFactory factory;

    Shape* shape1 = factory.createShape("circle");
    shape1->draw();  // 输出:Drawing a circle.

    Shape* shape2 = factory.createShape("rectangle");
    shape2->draw();  // 输出:Drawing a rectangle.

    delete shape1;
    delete shape2;

    return 0;
}

在上面的示例中,客户端通过调用 ShapeFactorycreateShape() 方法来创建图形对象,而不需要直接使用 new 关键字。这样,客户端与具体的图形类解耦,可以通过工厂类来创建不同的图形对象,而无需关心对象创建的具体细节。

工厂模式的优点在于它可以提供一种灵活的对象创建方式,可以根据需求动态地创建不同类型的对象。此外,工厂模式也符合单一职责原则,将对象创建的逻辑封装在工厂类中,使得代码更加可维护和可扩展。

工厂模式的引入主要是为了解决以下设计问题:

  1. 对象的创建和使用耦合度高:在传统的对象创建方式中,客户端代码通常需要直接使用具体类的构造函数来创建对象。这导致客户端与具体类之间存在紧耦合关系,一旦需要更换具体类或者添加新的类,就需要修改客户端代码。工厂模式通过引入工厂类,将对象的创建过程封装起来,降低了客户端与具体类之间的耦合度。
  2. 代码复杂度高:当对象的创建过程比较复杂,涉及到多个步骤或者依赖其他对象时,直接在客户端代码中进行对象的创建会导致代码复杂度增加。工厂模式将对象的创建过程集中在工厂类中,可以隐藏对象创建的复杂性,使得客户端代码更加简洁。
  3. 需要隐藏具体类的实现细节:有时候,我们希望将具体类的实现细节隐藏起来,只向客户端暴露抽象的接口。工厂模式可以通过工厂类来创建具体类的对象,并将对象返回给客户端,客户端只需要通过抽象接口来使用对象,无需知道具体类的实现细节。
  4. 实现对象创建的灵活性:工厂模式可以根据需求动态地创建不同类型的对象,而无需修改客户端代码。当需要添加新的具体类时,只需要修改工厂类的代码,而不需要修改客户端代码。这提供了一种灵活的对象创建方式,使得系统能够更好地应对变化和扩展。

同样也带来了一些弊端:

  • 违反开放封闭原则:当需要添加新的具体类时,必须修改工厂类的代码以支持新类的创建,那么工厂类永远不可能封闭。这违反了开放封闭原则,即对修改关闭,对扩展开放。每次添加新的类都需要修改工厂类,可能导致工厂类变得庞大而复杂。虽然可以通过创建一个工厂类的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。
  • 开放封闭原则?
    • 软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。简而言之,开放封闭原则要求我们设计的软件实体应该能够在不修改其源代码的情况下进行扩展,而只通过添加新的代码来实现新的功能或行为。这样做的好处是,我们可以在不破坏现有代码的情况下对系统进行扩展,降低了系统的维护成本,并提高了代码的可复用性和可扩展性。
  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 设计模式是软件开发中常用的一解决方案,它们是一些经过实践验证的可复用设计思想。设计模式允许开发人员在类和对象的结构上灵活地更改,并提供了一优雅的解决方案来应对各软件开发问题。 GOF(Gang of Four)是指Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位软件工程师,他们在《设计模式:可复用面向对象软件的基础》一书中总结了23常见的设计模式,这本书因此而获得了“设计模式圣经”的称号。 这本书以案例为基础,深入浅出地讲解了每个设计模式的原理和应用场景,并提供了C++实现源码。 其中,创建型设计模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。这些模式都提供了一方式来创建对象,使得程序在实例化对象时更加灵活和可扩展。 结构型设计模式包括适配器模式、装饰器模式、代理模式、组合模式、享元模式和外观模式。这些模式关注如何通过类和对象的组合来创建更大的结构,并提供了一优雅的方式来简化系统的复杂性。 行为型设计模式包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式和中介者模式。这些模式关注对象之间的通信和交互,它们提供了一优雅的方式来实现松耦合和可维护的代码。 总之,设计模式是软件开发中非常重要的一部分,它们提供了一通用的解决方案来处理常见的设计问题。通过学习和应用设计模式,开发人员可以提高代码的可复用性、可扩展性和可维护性,并加快开发进度。 ### 回答2: 设计模式是软件开发中常用的解决问题的一思维方式或者说是一已被证实有效的解决问题的方法。GOF 23设计模式是由四位著名的软件工程师提出并总结出的一套经典设计模式GOF 23设计模式分别是创建型模式、结构型模式和行为型模式。创建型模式包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式。结构型模式包括适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和代理模式。行为型模式包括策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。 GOF 23设计模式具有不同的应用场景和优势。通过学习和理解这些设计模式,开发者可以更加灵活地应对各软件开发中的问题。同时,掌握这些设计模式也有助于提高代码的可读性、可维护性和可扩展性。 附带C语言实现源码是一更加具体的学习和理解设计模式的方法。通过查看实现源码,可以更加直观地看到设计模式在实践中的应用。这些源码可以作为学习的参考,帮助开发者更好地理解设计模式的思想和使用方式。 总之,设计模式是软件开发中非常重要的一部分,通过学习GOF 23设计模式并理解其应用场景和优势,可以提高软件开发的效率和质量。附带C语言实现源码能够更加具体地帮助开发者理解设计模式的实际应用。 ### 回答3: 设计模式是软件工程中常用的一设计思想或模板,可以用于解决特定的问题和提供可重用的解决方案。GOF(Gang of Four)提出了23设计模式,并在书籍《设计模式:可复用面向对象软件的基础》中进行了详细的解析和说明。 这本书详细地介绍了23设计模式,包括创建型模式、结构型模式和行为型模式。通过阅读这本书,读者可以了解每设计模式的特点、适用场景和实现方法。另外,书中还通过示例代码的方式演示了每设计模式的具体实现,并提供了附带的C语言实现源码。 这本书对于理解设计模式的概念和思想非常有帮助。它不仅提供了23设计模式的名字和简介,还详细解释了每模式的适用场景和应用案例。读者可以通过学习这些设计模式,了解如何将它们应用于自己的软件开发工作中,提高代码的可重用性和可维护性。 书中的C语言实现源码是帮助读者理解和实践设计模式的重要资源。通过阅读源码,读者可以更加深入地理解每设计模式的具体实现细节,并进一步提升自己的编程能力。 总之,通过学习《设计模式:可复用面向对象软件的基础》这本书,读者可以全面了解设计模式的概念、分类和实现方法,并通过阅读附带的C语言实现源码来加深对设计模式的理解和应用。这将对提升软件设计和开发的能力和水平非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值