Factory Method

Intent

Define an interface for creating an object, but let subclasses decide which class to
instantiate. Factory Method lets a class defer instantiation to subclasses.

cpp 复制代码
#include <iostream>
#include <share.h>
#include <list>
#include <vector>
#include <memory>

class Document {
public:
	virtual void Open() {
		std::cout << "Document Open" << std::endl;
	}
	virtual void Close() {
	}
	virtual void Save() {
	}
	virtual void Revert() {
	}
};
class MyDocument : public Document {
public:
	virtual void Open() {
		std::cout << "MyDocument Open" << std::endl;
	}
	virtual void Close() {
	}
	virtual void Save() {
	}
	virtual void Revert() {
	}
};

class Application {
public:
	virtual std::shared_ptr<Document> CreateDocument() {
		return nullptr;
	}
	void NewDocument() {
		std::shared_ptr<Document> doc = CreateDocument();
		docs.push_back(doc);
		OpenDocument(doc);
	}
	void OpenDocument(std::shared_ptr<Document> doc) {
		doc->Open();
	}
private:
	std::vector<std::shared_ptr<Document> > docs{};
};

class MyApplication : public Application {
public:
	virtual std::shared_ptr<Document> CreateDocument() {
		std::cout << "MyApplication Construct" << std::endl;
		return std::make_shared<MyDocument>();
	}
};


int main()
{
	std::shared_ptr<Application> app = std::make_shared<MyApplication>();
	app->NewDocument();
}

Using templates to avoid subclassing

cpp 复制代码
// DesignPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <share.h>
#include <list>
#include <vector>
#include <memory>

class Product {
public:
	Product() {
	}
	virtual void callProductFunc() {
		std::cout << __FUNCTION__ << std::endl;
	}
};

class MyProduct1 : public Product {
public:
	MyProduct1() {
	}
	virtual void callProductFunc() {
		std::cout << __FUNCTION__ << std::endl;
	}
};

class MyProduct2 : public Product {
public:
	MyProduct2() {
	}
	virtual void callProductFunc() {
		std::cout << __FUNCTION__ << std::endl;
	}
};

class Creator {
public: 
	virtual std::shared_ptr<Product> CreateProduct() = 0;
};

// Using templates to avoid subclassing
template<class TheProduct>
class StandardCreator : public Creator {
public:
	virtual std::shared_ptr<Product> CreateProduct() {
		return std::make_shared<TheProduct>();
	}
};

class Application {
public:
	virtual void NewProduct() {
		
	}
protected:
	StandardCreator<MyProduct1> creator_1_;
	StandardCreator<MyProduct2> creator_2_;
};

class MyApplication : public Application {
public:
	virtual void NewProduct() {
		creator_1_.CreateProduct()->callProductFunc();
		creator_2_.CreateProduct()->callProductFunc();
	}
};

int main()
{
	std::shared_ptr<Application> app = std::make_shared<MyApplication>();
	app->NewProduct();
}
相关推荐
易水寒陈1 天前
单片机的工厂方法模式和桥接模式结合使用
单片机·桥接模式·工厂方法模式
夕珩2 天前
单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式、解释器模式、命令模式
单例模式·解释器模式·建造者模式·工厂方法模式·抽象工厂模式·命令模式·原型模式
蜜獾云3 天前
设计模式之工厂方法模式(5):稍微复杂一点的工厂模式
java·设计模式·工厂方法模式
BD_Marathon17 天前
工厂方法模式
android·java·工厂方法模式
青春易逝丶17 天前
工厂方法模式
工厂方法模式
逆境不可逃23 天前
【从零入门23种设计模式01】创建型之工厂模式(简单工厂+工厂方法+抽象工厂)
java·spring·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·工厂模式
Remember_9931 个月前
Java 工厂方法模式:解耦对象创建的优雅方案
java·开发语言·python·算法·工厂方法模式
她和夏天一样热2 个月前
【设计模式】工厂方法模式在开发中的真实应用
设计模式·工厂方法模式
进击的小头2 个月前
创建型模式:工厂方法模式(C语言实现)
c语言·工厂方法模式
小码过河.2 个月前
设计模式——工厂方法模式
设计模式·工厂方法模式