设计模式:

本文深入探讨了五种经典的设计模式:简单工厂方法、抽象工厂方法模式、单例模式、装饰模式和观察者模式。详细介绍了每种模式的实现方式、优缺点及应用场景,为软件设计提供实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,简单工厂方法:\red{1,简单工厂方法:}1

通过switch case语句块判断需要返回实例化哪个类。
然后通过基类指针指向派生类,实现不同的实例。

优点:\orange{优点:} 基本工厂方法,不需要关注实例化过程。
缺点:\green{缺点:} switch是最low的方法,臃肿,非常不推荐。

简单工厂方法

class Base{
    public:
    virtual void print() = 0;
};

class A : public Base{
    public:
    void print(){ puts("A");}
};

class B : public Base{
    public:
    void print(){ puts("B");}
};

class ABFactory{
    public:
    Base* createAorB(char type){
        switch(type){
            case 'A':
            return new A();
            case 'B':
            return new B();
            default:
            return NULL;
        }
    }
};

int main(){
    ABFactory* factory = new ABFactory();
    Base* a = factory->createAorB('A');
    Base* b = factory->createAorB('B');
    a->print();
    b->print();
    return 0;
}

2,抽象工厂方法模式:\red{2,抽象工厂方法模式:}2

有一个抽象工厂基类,在工厂基类上派生出不同的实例工厂。
优点:\orange{ 优点:} 扩展性比较好
缺点:\green{缺点:} 每一个实例都要对应一个工厂,代码量大。

抽象工厂方法

class Base{
    public:
    virtual void print() = 0;
};

class A : public Base{
    public:
    virtual void print(){ puts("A");}
};

class B : public Base{
    public:
    virtual void print(){ puts("B");}
};

class Factory{
    public:
    virtual Base* product() = 0;
};

class FactoryA: public Factory{
    public:
    virtual Base* product(){ return new A();}
};

class FactoryB: public Factory{
    public:
    virtual Base* product(){ return new B();}
};

int main(){
    Factory* FA = new FactoryA();
    Factory* FB = new FactoryB();
    Base* A = FA->product();
    Base* B = FB->product();
    A->print();
    B->print();
    return 0;
}

3,单例模式:\red{3,单例模式:}3

懒汉模式 vs 饿汉模式:\orange{懒汉模式\ vs\ 饿汉模式:} vs 饿

懒汉模式:\blue{懒汉模式:}

没有用到时,不会实例化

mutex mt;

class Singleton{
private:
    static Singleton* s;
private:
    Singleton(){} // 私有构造
    Singleton(const Singleton& ) = delete; // 拷贝构造
    Singleton& operator=(const Singleton& ) = delete; //赋值构造
public:
    static Singleton* getInstance();
};

Singleton* Singleton::s = NULL;

Singleton* Singleton::getInstance(){
    if(s == NULL){
        mt.lock();
        if(s == NULL) s = new Singleton();
        mt.unlock();
    }
    return s;
}

饿汉模式:\blue{饿汉模式:}饿

初始化时即存在实例

class Singleton{
private:
    static Singleton* s;
private:
    Singleton(){}
    Singleton(const Singleton& ) = delete;
    Singleton& operator=(const Singleton& ) = delete;
public:
    static Singleton* getInstance();
};

Singleton* Singleton::s = new Singleton();

Singleton* Singleton::getInstance(){ return s; }

4,装饰模式:\red{4,装饰模式:}4

在基础功能上添加新功能,用组合指针实现。

装饰模式

// 基础类
class Human{
public:
    void walk(){ puts("walk"); }
};

// 在基础类上添加新功能
class Human_fly{
private:
    Human* man;
    void add_fly(){ puts("Install fly"); }
public:
    Human_fly(Human* h):man(h){}
    void walk(){
        man->walk();
        add_fly();
    }
};
int main(){
    Human* Aman = new Human();
    Human_fly* Bman = new Human_fly(Aman);
    Bman->walk();
    return 0;
}

5,观察者模式:\red{5,观察者模式:}5

定义一对多依赖,目标对象状态改变,多个观察者收到通知并自动更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值