设计模式——创建型模式

工厂方法模式

简称工厂模式。

为一类对象的共有接口抽象出基类,工厂生产基类。

class PhoneFactory {
    static std::shared_ptr<Phone> Make();

};

class Phone {
    virtual void call() = 0;
};

class XiaoMiPhone final : public Phone {
    void call() override;
};

class iPhone final : public Phone {
    void call() override;
};

抽象工厂模式

A,B 两个工厂都生产 X,Y,Z 三种产品,有的情况下,我们只能用 A 工厂的产品。A,B 工厂的产品不会混用。

比如当我们希望代码跨平台时,我们给对一些方法进行封装,在不同平台下自动使用 windows / linux 的实现。

virtual class X;
virtual class Y;
virtual class Z;

class Factory{
    virtual X* make_X() = 0;
    virtual Y* make_Y() = 0;
    virtual Z* make_Z() = 0;
}

class AbstractFactory {
    static std::shared_ptr<Factory> Make() { return AFactory() or BFactory(); }
};

class AFactory {
    X* make_X() override;
    Y* make_Y() override;
    Z* make_Z() override;
};

class BFactory {
    X* make_X() override;
    Y* make_Y() override;
    Z* make_Z() override;
};

生成器模式

又称建造器(Builder)模式。

构造一个对象的参数过多时,考虑使用生成器模式。生成器基类中将这些属性声明为 setXXX() 方法。

class A;
class B;
class C;
class Product;
class ProductManual;

class Builder {
    virtual void setA(A a) = 0;
    virtual void setC(C c) = 0;
};

class ProductBuilder {
    void setB(B a) override;
    void setC(C a) override;
    Product get();
};

class ProductManualBuilder {
    void setA(A a) override;
    void setB(B a) override;
    void setC(C a) override;
    ProductManual get();
};

// 可选的主管
class Director {
    void build(Builder* builder) {
        if (builder is ProductManualBuilder ) {
            builder.setA();
        }
        builder.setB();
        builder.setC();
    }
};

int main()
{    
    ProductBuilder product_builder;
    ProductManualBuilder product_manual_builder;

    Director director;
    director.build(&product_builder);
    director.build(&product_manual_builder);

    Product product = product_builder.get();
    ProductManualBuilder product_manual = product_manual_builder.get();
}    

原型模式

又称克隆模式。

克隆模式允许外部调用基类的 clone() 方法,来复制派生类对象。

简单来说,基类声明 clone() 方法,子类实现之。

class Shape {
    int x;
    int y;
    std::string color;

    virtual Shape* clone() = 0;
};

class Rectangle : public Shape {
    int width;
    int height;

    Rectangle(Rectangle other) {
        this.with = other.width;
        this.height = other.height;
    }

    Shape* clone() override {
        return new Rectangle(this);
    }

};

class Circle : public Shape {
    int radius;

    Circle(Circle other) {
        this.radius = other.radius;
    }

    Shape* clone() override {
        return new Circle(this);
    }
};

单例模式

无需多言。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值