国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《設計模式的藝術》筆記 - 工廠方法模式

這篇具有很好參考價值的文章主要介紹了《設計模式的藝術》筆記 - 工廠方法模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

介紹

? ? ? ? 在簡單工廠模式中,當系統(tǒng)中需要引入新的產(chǎn)品時,由于靜態(tài)工廠方法通過所傳入的參數(shù)的不同來創(chuàng)建不同的產(chǎn)品,這必定要修改工廠類的源代碼,將違背開閉原則。因此,工廠方法模式應運而生。工廠方法模式是定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化

實現(xiàn)

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;  // 抽象方法的聲明,由具體產(chǎn)品實現(xiàn)
};

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() { // 公共方法的實現(xiàn)
    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);    // 新增
};

隱藏工廠類創(chuàng)建產(chǎn)品實例方法

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

總結

????????優(yōu)點:

? ? ? ? 1.?在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時還向客戶隱藏了哪種具體產(chǎn)品類將被實例化這一細節(jié)。用戶只需要關心所需產(chǎn)品對應的工廠,無須關心創(chuàng)建細節(jié),甚至無須知道具體產(chǎn)品類的類名。

? ? ? ? 2.?基于工廠角色和產(chǎn)品角色的多態(tài)性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定創(chuàng)建何種產(chǎn)品對象,而如何創(chuàng)建這個對象的細節(jié)則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多態(tài)工廠模式,正是因為所有的具體工廠類都具有同一抽象父類。

? ? ? ? 3.?使用工廠方法模式的另一個優(yōu)點是在系統(tǒng)中加入新產(chǎn)品時,無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴展性也就變得非常好,完全符合開閉原則。

? ? ? ? 缺點:

? ? ? ? 1.?在添加新產(chǎn)品時,需要編寫新的具體產(chǎn)品類,而且還要提供與之對應的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復雜度,有更多的類需要編譯和運行,會給系統(tǒng)帶來一些額外的開銷。

? ? ? ? 2.?由于考慮到系統(tǒng)的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到DOM、反射等技術,增加了系統(tǒng)的實現(xiàn)難度。

練習

????????使用工廠方法模式設計一個程序來讀取各種不同類型的圖片格式,針對每種圖片格式都設計一個圖片讀取器。例如,GIF圖片讀取器用于讀取GIF格式的圖片,JPG圖片讀取器用于讀取JPG格式的圖片。需充分考慮系統(tǒng)的靈活性和可擴展性。

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文章來源地址http://www.zghlxwxcb.cn/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模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《設計模式的藝術》筆記 - 策略模式

    ? ? ? ? 策略模式定義一系列算法類,將每一個算法封裝起來,并讓它們可以相互替換。策略模式讓算法獨立于使用它的客戶而變化,也稱為政策模式。策略模式是一種對象行為模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?策略模式提供了對開閉原則的完美支持。用戶可以在不

    2024年01月25日
    瀏覽(23)
  • 《設計模式的藝術》筆記 - 原型模式

    ? ? ? ? 使用原型實例指定創(chuàng)建對象的種類,并且通過克隆這些原型創(chuàng)建新的對象。原型模式是一種對象創(chuàng)建型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 優(yōu)點: ? ? ? ? 1.?當創(chuàng)建新的對象實例較為復雜時,使用原型模式可以簡化對象的創(chuàng)建過程,通過復制一個已有實例可以提

    2024年01月19日
    瀏覽(22)
  • 《設計模式的藝術》筆記 - 狀態(tài)模式

    ? ? ? ? 狀態(tài)模式允許一個對象在其內部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類。其別名為狀態(tài)對象,狀態(tài)模式是一種對象行為模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?封裝了狀態(tài)的轉換規(guī)則。在狀態(tài)模式中可以將狀態(tài)的轉換代碼封裝在環(huán)境類或者具體狀

    2024年01月25日
    瀏覽(79)
  • 《設計模式的藝術》筆記 - 外觀模式

    ? ? ? ? 外觀模式中外部與一個子系統(tǒng)的通信通過一個統(tǒng)一的外觀角色進行,為子系統(tǒng)中的一組接口提供一個一致的入口。外觀模式定義了一個高層接口,這個接口使得子系統(tǒng)更加容易使用。外觀模式又稱為門面模式,它是一種對象結構型模式。 myclass.h myclass.cpp main.cpp ? ?

    2024年01月19日
    瀏覽(25)
  • 《設計模式的藝術》筆記 - 組合模式

    ? ? ? ? 組合模式組合多個對象形成樹形結構以表示具有“部分-整體”關系的層次結構。組合模式對單個對象(即葉子對象)和組合對象(即容器對象)的使用具有一致性,又可以稱為“部分—整體”(Part-Whole)模式,它是一種對象結構型模式。 myclass.h myclass.cpp main.cpp ?

    2024年01月19日
    瀏覽(15)
  • 《設計模式的藝術》筆記 - 裝飾模式

    ? ? ? ? 裝飾模式動態(tài)地給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現(xiàn)更為靈活。裝飾模式是一種對象結構型模式。 ?myclass.h myclass.cpp main.cpp ? ? ? ? 1.?對于擴展一個對象的功能,裝飾模式比繼承更加靈活性,不會導致類的個數(shù)急劇增加

    2024年01月19日
    瀏覽(24)
  • 《設計模式的藝術》筆記 - 命令模式

    ? ? ? ? 命令模式將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數(shù)化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。命令模式是一種對象行為模式,其別名為動作模式或事務模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 只需要增加一個CommandQueue類即可

    2024年01月20日
    瀏覽(29)
  • 《設計模式的藝術》筆記 - 代理模式

    ? ? ? ? 代理模式是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式是一種對象結構型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?代理模式能夠協(xié)調調用者和被調用者,在一定程度上降低了系統(tǒng)的耦合度,滿足迪米特法則。 ? ? ? ? 2.?客戶端可以

    2024年01月19日
    瀏覽(15)
  • 《設計模式的藝術》筆記 - 橋接模式

    ? ? ? ? 橋接模式將抽象部分與其實現(xiàn)部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體模式或接口模式 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?分離抽象接口及其實現(xiàn)部分。橋接模式使用“對象間的關聯(lián)關系”解耦了抽象和實現(xiàn)之間固有的綁定關系,

    2024年01月18日
    瀏覽(23)
  • 設計模式(二)、工廠模式--工廠方法模式

    工廠方法模式是一種常用的創(chuàng)建型設計模式。它解決了簡單工廠模式的問題:如違反了開閉原則,其次可以用于更復雜的結構 它的核心結構有四個角色? 抽象工廠;具體工廠;抽象產(chǎn)品;具體產(chǎn)品 抽象工廠(抽象類或接口)不在負責具體的創(chuàng)建過程,即具體的代碼實現(xiàn)。只制定

    2024年02月16日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包