《设计模式的艺术》笔记 - 工厂方法模式

这篇具有很好参考价值的文章主要介绍了《设计模式的艺术》笔记 - 工厂方法模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

        在简单工厂模式中,当系统中需要引入新的产品时,由于静态工厂方法通过所传入的参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则。因此,工厂方法模式应运而生。工厂方法模式是定义一个用于创建对象的接口,让子类决定将哪一个类实例化

实现

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Product {
public:
    void methodSame();

    virtual void methodDiff() = 0;  // 抽象方法的声明,由具体产品实现
};

class ConcreteProductA : public Product {
public:
    void methodDiff() override;
};

class ConcreteProductB : public Product {
public:
    void methodDiff() override;
};

class Factory {
public:
    virtual Product *createProduct() = 0;
};

class ProductAFactory : public Factory {
public:
    Product *createProduct() override;
};

class ProductBFactory : public Factory {
public:
    Product *createProduct() override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

#include "myclass.h"

void Product::methodSame() { // 公共方法的实现
    std::cout << "methodSame" << std::endl;
}

void ConcreteProductA::methodDiff() {
    std::cout << "ConcreteProductA" << std::endl;
}

void ConcreteProductB::methodDiff() {
    std::cout << "ConcreteProductB" << std::endl;
}

Product *ProductAFactory::createProduct() {
    return new ConcreteProductA();
}

Product *ProductBFactory::createProduct() {
    return new ConcreteProductB();
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Factory *factory;
    Product *product;

    factory = new ProductAFactory();
    product = factory->createProduct();
    product->methodSame();
    product->methodDiff();
    delete factory;
    delete product;

    factory = new ProductBFactory();
    product = factory->createProduct();
    product->methodSame();
    product->methodDiff();
    delete factory;
    delete product;
    return 0;
}

重载工厂类方法

class Factory {
public:
    virtual Product *createProduct() = 0;
    virtual Product *createProduct(std::string opt);    // 新增
};

隐藏工厂类创建产品实例方法

class Factory {
public:
    virtual Product *createProduct() = 0;
    void methodDiff() {
        Product *product = this->createProduct();
        product->methodDiff();
        delete product;
    }
};

总结

        优点:

        1. 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。

        2. 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,正是因为所有的具体工厂类都具有同一抽象父类。

        3. 使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合开闭原则。

        缺点:

        1. 在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

        2. 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

练习

        使用工厂方法模式设计一个程序来读取各种不同类型的图片格式,针对每种图片格式都设计一个图片读取器。例如,GIF图片读取器用于读取GIF格式的图片,JPG图片读取器用于读取JPG格式的图片。需充分考虑系统的灵活性和可扩展性。

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Reader {
public:
    virtual void read(const std::string &file) = 0;
};

class GIFReader : public Reader {
public:
    void read(const std::string &file) override;
};

class JPGReader : public Reader {
public:
    void read(const std::string &file) override;
};

class Factory {
private:
    virtual Reader *createReader() = 0;
public:
    void read(const std::string &file) {
        Reader *reader = this->createReader();
        reader->read(file);
        delete reader;
    }
};

class GIFFactory : public Factory {
private:
    Reader *createReader() override;
};

class JPGFactory : public Factory {
private:
    Reader *createReader() override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

#include "myclass.h"

void GIFReader::read(const std::string &file) {
    std::cout << "read GIF file: " << file << std::endl;
}

void JPGReader::read(const std::string &file) {
    std::cout << "read JPG file: " << file << std::endl;
}

Reader* GIFFactory::createReader() {
    return new GIFReader();
}

Reader* JPGFactory::createReader() {
    return new JPGReader();
}

main.cpp文章来源地址https://www.toymoban.com/news/detail-816690.html

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Factory *factory;

    factory = new GIFFactory();
    factory->read("file.gif");
    delete factory;

    factory = new JPGFactory();
    factory->read("file.jpg");
    delete factory;
    return 0;
}

到了这里,关于《设计模式的艺术》笔记 - 工厂方法模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《设计模式的艺术》笔记 - 命令模式

            命令模式将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为模式,其别名为动作模式或事务模式。 myclass.h myclass.cpp main.cpp         只需要增加一个CommandQueue类即可

    2024年01月20日
    浏览(40)
  • 《设计模式的艺术》笔记 - 代理模式

            代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 myclass.h myclass.cpp main.cpp         1. 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度,满足迪米特法则。         2. 客户端可以

    2024年01月19日
    浏览(45)
  • 《设计模式的艺术》笔记 - 装饰模式

            装饰模式动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。  myclass.h myclass.cpp main.cpp         1. 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加

    2024年01月19日
    浏览(43)
  • 《设计模式的艺术》笔记 - 原型模式

            使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的对象。原型模式是一种对象创建型模式。 myclass.h myclass.cpp main.cpp         优点:         1. 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程,通过复制一个已有实例可以提

    2024年01月19日
    浏览(31)
  • 《设计模式的艺术》笔记 - 组合模式

            组合模式组合多个对象形成树形结构以表示具有“部分-整体”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,又可以称为“部分—整体”(Part-Whole)模式,它是一种对象结构型模式。 myclass.h myclass.cpp main.cpp  

    2024年01月19日
    浏览(37)
  • 《设计模式的艺术》笔记 - 策略模式

            策略模式定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种对象行为模式。 myclass.h myclass.cpp main.cpp         1. 策略模式提供了对开闭原则的完美支持。用户可以在不

    2024年01月25日
    浏览(36)
  • 《设计模式的艺术》笔记 - 状态模式

            状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象,状态模式是一种对象行为模式。 myclass.h myclass.cpp main.cpp         1. 封装了状态的转换规则。在状态模式中可以将状态的转换代码封装在环境类或者具体状

    2024年01月25日
    浏览(45)
  • 《设计模式的艺术》笔记 - 桥接模式

            桥接模式将抽象部分与其实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式 myclass.h myclass.cpp main.cpp         1. 分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,

    2024年01月18日
    浏览(44)
  • 《设计模式的艺术》笔记 - 外观模式

            外观模式中外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 myclass.h myclass.cpp main.cpp    

    2024年01月19日
    浏览(41)
  • 设计模式(二)、工厂模式--工厂方法模式

    工厂方法模式是一种常用的创建型设计模式。它解决了简单工厂模式的问题:如违反了开闭原则,其次可以用于更复杂的结构 它的核心结构有四个角色  抽象工厂;具体工厂;抽象产品;具体产品 抽象工厂(抽象类或接口)不在负责具体的创建过程,即具体的代码实现。只制定

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包