创建型模式

  工厂模式:工厂类使用返回值为基类指针类型的函数,根据不同字符串创建派生类产品。
  抽象工厂模式:先用工厂模式生产工厂,再用工厂模式生产产品。
  单例模式:限定构造函数为私有。使用静态成员函数返回指针型成员对象。

1. 工厂模式


#include <iostream>
using namespace std;

// 1. 抽象类
class Car {
   public:
	virtual void createCar() = 0;
};

// 1.1生产奥迪
class Audi: public Car {
  public:
	void createCar() {
		cout << "Create Audi ..." << endl;
	}
};

// 1.2生产宝马
class BMW: public Car {
  public:
	void createCar() {
		cout << "Create BMW ..." << endl;
	}
};

// 2.工厂
class CarFactory {
  public:
	Car* create(string carType) {
        	if(carType.compare("Audi") == 0)
			return new Audi();
        	else if(carType.compare("BMW") == 0)
			return new BMW();
		return NULL;
	}
};

// 3.使用工厂
int main(int argc, char **argv) {
	CarFactory* carFactory = new CarFactory();
	Car* audi = carFactory->create("Audi");
	audi->createCar();

	Car* bmw = carFactory->create("BMW");
	bmw->createCar();
}

  第11至24行定义了生产奥迪和宝马的类。
  第27至36行的工厂类,用于接受用户指令以创建用户想要的对象。

2. 抽象工厂模式


#include <iostream>
using namespace std;

// 1.生成车的抽象类
class Car {
   public:
	virtual void createCar() = 0;
};

// 1.1生产奥迪
class Audi: public Car {
  public:
	void createCar() {
		cout << "Create Audi ..." << endl;
	}
};

// 1.2生产宝马
class BMW: public Car {
  public:
	void createCar() {
		cout << "Create BMW ..." << endl;
	}
};

// 2.涂颜色的抽象类
class Color {
   public:
	virtual void fillColor() = 0;
};

// 2.1涂红色
class Red: public Color {
   public:
	void fillColor() {
		cout << "file red ..." << endl;
	}
};

// 2.2涂绿色
class Green: public Color {
   public:
	void fillColor() {
		cout << "fill green ..." << endl;
	}
};

// 3.工厂接口
class AbstractFactory {
   public:
	virtual Car* makeCarFactory(string carType) = 0;
	virtual Color* makeColorFactory(string colorType) = 0;
};


// 3.1生产车的工厂
class CarFactory: public AbstractFactory {
   public:
	Car* makeCarFactory(string carType) {
		if(carType.compare("Audi") == 0)
			return new Audi();
		else if(carType.compare("BMW") == 0)
			return new BMW();
		return NULL;
	}

	Color* makeColorFactory(string colorType) {
		return NULL;
	}
};


// 3.2涂颜色的工厂
class ColorFactory: public AbstractFactory {
   public:
	Car* makeCarFactory(string carType) {
		return NULL;
	}

	Color* makeColorFactory(string colorType) {
		if(colorType.compare("Red") == 0)
			return new Red();
		else if(colorType.compare("Green") == 0)
			return new Green();
		return NULL;
	}
};


// 4.工厂创造器/生成器类
class FactoryProducer {
   public:
	static AbstractFactory* getFactory(string factoryType) {
		if(factoryType.compare("Car") == 0)
			return new CarFactory();
		else if(factoryType.compare("Color") == 0)
			return new ColorFactory();
		return NULL;
	}
};


int main() {
	AbstractFactory* carFactory = FactoryProducer::getFactory("Car");
	Car* audi = carFactory->makeCarFactory("Audi");
	audi->createCar();
	Car* bmw = carFactory->makeCarFactory("BMW");
	bmw->createCar();

	AbstractFactory* colorFactory = FactoryProducer::getFactory("Color");
	Color* red = colorFactory->makeColorFactory("Red");
	red->fillColor();
	Color* green = colorFactory->makeColorFactory("Green");
	green->fillColor();
}

3. 单例模式


#include <iostream>
using namespace std;

class SingleObject {
   public:
	static SingleObject* getInstance() {
		if(instance == NULL)
			instance = new SingleObject();
		return instance;
	}
   private:
	SingleObject() = default;
	static SingleObject* instance;
};

SingleObject* SingleObject::instance = NULL;

int main() {
	SingleObject* s1 = SingleObject::getInstance();
	SingleObject* s2 = SingleObject::getInstance();
	if(s1 == s2)
		cout << "s1 == s2" << endl;
	return 0;
}

[参考]

4. 建造者模式



[参考]

5. 原型模式


  用对象指定创建对象的种类。

#include <iostream>
using namespace std;

class CPrototype {
   public:
	virtual CPrototype* Clone() = 0;
};

class CConcretePrototype: public CPrototype {
   public:
	virtual CPrototype* Clone() {
		return new CConcretePrototype(*this);
	}
};
 
int main() {
	CPrototype* conProA = new CConcretePrototype();

	CPrototype* conProB = conProA->Clone();
	if(conProA == conProB)
		cout << "s1 == s2" << endl;
	else
		cout << "s1 != s2" << endl;
}

  第19行创建对象时,用对象conProA指定创建对象conProB的种类。
  原型模式的核心是clone()方法,从第19行来看,客户不需要知道对象conProA的实际类型,只需知道它的抽象基类是CPrototype即可。

[参考]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值