通常用于隐藏类的实现细节,或者提供便捷的类创造服务.
在某些情况下,软件会遇到贯穿其生命周期始终的对象,这时候,我们需要通过合适的方法,去保证在每一个时刻,最多存在一个这个类的实例:
cpp#pragma once
#include <memory>
#include <vector>
namespace Singleton {
class GameManager{
private:
GameManager() {}
GameManager(const GameManager&) = delete;
GameManager& operator=(const GameManager&) = delete;
public:
static ::std::shared_ptr<GameManager> getInstance() {
static ::std::shared_ptr<GameManager> instance(new GameManager());
return instance;
}
}
}
有时,我们希望某些类可以通过自身来构造新的类,所以我们以它为原型,创建一个新的类
cpp#pragma once
#include <memory>
#include <vector>
namespace CanCopy {
struct copyable {
virtual ::std::shared_ptr<copyable> clone() const = 0;
virtual ~copyable() = default;
};
class Map : public copyable {
public:
virtual ::std::shared_ptr<copyable> clone() const override {
return ::std::make_shared<Map>(*this);
}
};
}
对于一系列相同的类的创建,我们不希望在每一个地方显式的写出构造函数,而是希望将其委托给第三方来做,这样做的好处在于: 如果之后遇到修改类的构造函数的情况,我们可以只在Factory一个地方给出修改,而不用修改多处代码.
cpp#pragma once
#include <iostream>
#include <memory>
namespace Factory {
class Product {
};
class ProductA : public Product {
};
class CreateProductFactory {
public:
virtual std::shared_ptr<Product> createProduct() = 0;
};
class CreateProductAFactory:public CreateProductFactory {
public:
virtual std::shared_ptr<Product> createProduct() override {
return std::make_shared<ProductA>();
}
};
}
UML设计如下:

类似于工厂方法模式,其实就是一个工厂生产一种对象变成一个工厂生产多种对象,类比于上面的话,相当于合并ProductAFactory和ProductBFactory,同时将这几个method抽象成接口给到CreateFactory
由于一个工厂能够生产的东西越来越多,给客户(包括程序员)带来了较大的理解负担,所以希望能够在Factory中增加一个"前台",这个前台获取用户的要求,然后通知工人生产对应的"产品".
在快速变化的系统中,如果我们预估,一个类如果经常会进行修改的话,那么经常修改构造函数是个比较危险的行为,因为一个好的系统应该对扩展开放,而对修改封闭. 为了能够解决这个问题,我们可以将类型的构造分离,每一步都是在对这个对象进行安装,最后形成一个整体.
本文作者:barrenham
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!