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

《設(shè)計(jì)模式的藝術(shù)》筆記 - 原型模式

這篇具有很好參考價(jià)值的文章主要介紹了《設(shè)計(jì)模式的藝術(shù)》筆記 - 原型模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

介紹

? ? ? ? 使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過克隆這些原型創(chuàng)建新的對(duì)象。原型模式是一種對(duì)象創(chuàng)建型模式。

實(shí)現(xiàn)

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Prototype {
public:
    void setId(uint64_t id);

    uint64_t getId();

    virtual Prototype *clone() = 0;

private:
    uint64_t m_id;
};

class ConcretePrototype : public Prototype {
public:
    Prototype *clone() override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

void Prototype::setId(uint64_t id) {
    m_id = id;
}

uint64_t Prototype::getId() {
    return m_id;
}

Prototype* ConcretePrototype::clone() {
    ConcretePrototype *prototype = new ConcretePrototype();
    prototype->setId(this->getId());
    return prototype;
}

main.cpp

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

int main() {
    Prototype *obj1 = new ConcretePrototype();
    std::cout << "obj1: " << std::hex << obj1 << ", id: " << obj1->getId() << std::endl;
    auto obj2 = obj1->clone();
    std::cout << "obj2: " << std::hex << obj2 << ", id: " << obj2->getId() << std::endl;
    delete obj1;
    delete obj2;

    return 0;
}

總結(jié)

? ? ? ? 優(yōu)點(diǎn):

? ? ? ? 1.?當(dāng)創(chuàng)建新的對(duì)象實(shí)例較為復(fù)雜時(shí),使用原型模式可以簡(jiǎn)化對(duì)象的創(chuàng)建過程,通過復(fù)制一個(gè)已有實(shí)例可以提高新實(shí)例的創(chuàng)建效率。

? ? ? ? 2.?擴(kuò)展性較好。由于在原型模式中提供了抽象原型類,在客戶端可以針對(duì)抽象原型類進(jìn)行編程,而將具體原型類寫在配置文件中,增加或減少具體原型類對(duì)原有系統(tǒng)都沒有任何影響。

? ? ? ? 3.?原型模式提供了簡(jiǎn)化的創(chuàng)建結(jié)構(gòu)。工廠方法模式常常需要有一個(gè)與產(chǎn)品類等級(jí)結(jié)構(gòu)相同的工廠等級(jí)結(jié)構(gòu),而原型模式就不需要這樣。原型模式中產(chǎn)品的復(fù)制是通過封裝在原型類中的克隆方法實(shí)現(xiàn)的,無須專門的工廠類來創(chuàng)建產(chǎn)品。

? ? ? ? 4.?可以使用深克隆的方式保存對(duì)象的狀態(tài)。使用原型模式將對(duì)象復(fù)制一份并將其狀態(tài)保存起來,以便在需要的時(shí)候使用,例如恢復(fù)到某一歷史狀態(tài),可輔助實(shí)現(xiàn)撤銷操作。

? ? ? ? 缺點(diǎn):

? ? ? ??1.?需要為每一個(gè)類配備一個(gè)克隆方法,而且該克隆方法位于一個(gè)類的內(nèi)部。當(dāng)對(duì)已有的類進(jìn)行改造時(shí),需要修改源代碼,違背了開閉原則。

? ? ? ? 2.?在實(shí)現(xiàn)深克隆時(shí)需要編寫較為復(fù)雜的代碼,而且當(dāng)對(duì)象之間存在多重的嵌套引用時(shí),為了實(shí)現(xiàn)深克隆,每一層對(duì)象對(duì)應(yīng)的類都必須支持深克隆,實(shí)現(xiàn)起來可能會(huì)比較麻煩。

? ? ? ? 適用場(chǎng)景:

? ? ? ? 1.?創(chuàng)建新對(duì)象成本較大(例如初始化需要占用較長(zhǎng)的時(shí)間,占用太多的CPU資源或網(wǎng)絡(luò)資源)。新的對(duì)象可以通過原型模式對(duì)已有對(duì)象進(jìn)行復(fù)制來獲得,如果是相似對(duì)象,則可以對(duì)其成員變量稍作修改。

? ? ? ? 2.?如果系統(tǒng)要保存對(duì)象的狀態(tài),而對(duì)象的狀態(tài)變化很小,或者對(duì)象本身占用內(nèi)存較少時(shí),可以使用原型模式配合備忘錄模式(本書第21章介紹)來實(shí)現(xiàn)。

? ? ? ? 3.?需要避免使用分層次的工廠類來創(chuàng)建分層次的對(duì)象,并且類的實(shí)例對(duì)象只有一個(gè)或很少的幾個(gè)組合狀態(tài)。通過復(fù)制原型對(duì)象得到新實(shí)例可能比使用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例更加方便。

練習(xí)

myclass.h

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

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Address {
public:
    std::string m_name;
    uint32_t m_id;
};

class Object {
public:
    virtual Object *deepClone() = 0;
    virtual Object *clone() = 0;
};

class Customer : public Object {
public:
    Customer() {}
    Customer(Address *addr);
    Address *getAddress();
    void setAddress(Address *addr);
    Object *deepClone() override;
    Object *clone() override;

private:
    Address *m_addr;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

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

#include "myclass.h"

Customer::Customer(Address *addr) {
    m_addr = addr;
}

Address* Customer::getAddress() {
    return m_addr;
}

void Customer::setAddress(Address *addr) {
    m_addr = addr;
}

Object* Customer::clone() {
    Customer *customer = new Customer();
    customer->setAddress(m_addr);
    return customer;
}

Object* Customer::deepClone() {
    Customer *customer = new Customer();
    Address *address = new Address();
    address->m_id = m_addr->m_id;
    address->m_name = m_addr->m_name;
    customer->setAddress(address);
    return customer;
}

main.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-804815.html

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

int main() {
    Address *addr = new Address();
    addr->m_id = 1;
    addr->m_name = "abc";
    Object *obj1 = new Customer(addr);
    auto obj2 = obj1->clone();
    auto obj3 = obj1->deepClone();
    std::cout << "obj1: " << std::hex << obj1 << ", addr = " << std::hex << dynamic_cast<Customer *>(obj1)->getAddress() << ", id = " << dynamic_cast<Customer *>(obj1)->getAddress()->m_id << ", name = " << dynamic_cast<Customer *>(obj1)->getAddress()->m_name << std::endl;
    std::cout << "obj2: " << std::hex << obj2 << ", addr = " << std::hex << dynamic_cast<Customer *>(obj2)->getAddress() << ", id = " << dynamic_cast<Customer *>(obj2)->getAddress()->m_id << ", name = " << dynamic_cast<Customer *>(obj2)->getAddress()->m_name << std::endl;
    std::cout << "obj3: " << std::hex << obj3 << ", addr = " << std::hex << dynamic_cast<Customer *>(obj3)->getAddress() << ", id = " << dynamic_cast<Customer *>(obj3)->getAddress()->m_id << ", name = " << dynamic_cast<Customer *>(obj3)->getAddress()->m_name << std::endl;

    return 0;
}

到了這里,關(guān)于《設(shè)計(jì)模式的藝術(shù)》筆記 - 原型模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 組合模式

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

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

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

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

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

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

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

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

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

    2024年01月18日
    瀏覽(23)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 策略模式

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

    2024年01月25日
    瀏覽(23)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 迭代器模式

    ? ? ? ? 迭代器模式提供一種方法來訪問聚合對(duì)象,而不用暴露這個(gè)對(duì)象的內(nèi)部表示,其別名為游標(biāo)(Cursor)。迭代器模式是一種對(duì)象行為型模式。 myclass.h myclass.cpp main.cpp ? ? ? ? 1. 支持以不同的方式遍歷一個(gè)聚合對(duì)象,在同一個(gè)聚合對(duì)象上可以定義多種遍歷方式。在迭代

    2024年01月24日
    瀏覽(21)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 簡(jiǎn)單工廠模式

    《設(shè)計(jì)模式的藝術(shù)》筆記 - 簡(jiǎn)單工廠模式

    ? ? ? ? 定義一個(gè)工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有相同的父類。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)方法,因此簡(jiǎn)單工廠模式又被稱為靜態(tài)工廠方法模式,屬于類創(chuàng)建型模式 ? ? ? ? 將Factory合并到父類Product中,此時(shí)

    2024年01月16日
    瀏覽(21)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 單例模式

    ????????單例模式優(yōu)點(diǎn)是可以確保系統(tǒng)中只存在單個(gè)對(duì)象實(shí)例,缺點(diǎn)是不便擴(kuò)展,一定程度上違背單一原則,既提供業(yè)務(wù)方法,又提供創(chuàng)建對(duì)象方法 ? ? ? ? 在類加載的時(shí)候就創(chuàng)建好對(duì)象,獲取對(duì)象時(shí)直接返回即可 ? ? ? ? 在類加載的時(shí)候沒有創(chuàng)建對(duì)象,第一次獲取對(duì)象

    2024年02月02日
    瀏覽(18)
  • 《設(shè)計(jì)模式的藝術(shù)》筆記 - 享元模式

    ? ? ? ? 享元模式運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用。系統(tǒng)只使用少量的對(duì)象,而這些對(duì)象都很相似,狀態(tài)變化很小,可以實(shí)現(xiàn)對(duì)象的多次復(fù)用。由于享元模式要求能夠共享的對(duì)象必須是細(xì)粒度對(duì)象,因此它又稱為輕量級(jí)模式,是一種對(duì)象結(jié)構(gòu)型模式。 myclass.

    2024年01月19日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包