设计模式——工厂方法模式(C++)

来源:互联网 发布:域名cc是外国的吗? 编辑:程序博客网 时间:2024/05/16 12:23
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:main.cpp@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Factory.h"#include "Product.h"#include "concreteFactory.h"#include "concreteProduct.h"#include <iostream>using namespace std;// 工厂方法模式:抽象工厂、具体工厂、抽象产品、具体产品// 这种模式,一个具体产品对应一个具体工厂,由于基类产品和基类工厂是抽象出来的,所以该模式能够很好的对"修改关闭,扩展开放"// 但是,当具体产品种类非常多的时候,与其相对应的具体工厂就会非常多,因此会造成类的数量成倍增长,这是不好的现象。int main() {    Factory* factory1 = new concreteFactoryA();    Product* product1 = factory1->creator();    product1->property1();    product1->property2();    product1->property3();    Factory* factory2 = new concreteFactoryB();    Product* product2 = factory2->creator();    product2->property1();    product2->property2();    product2->property3();    Factory* factory3 = new concreteFactoryC();    Product* product3 = factory3->creator();    product3->property1();    product3->property2();    product3->property3();    system("pause");    return 0;}

抽象工厂类:

/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Factory.h@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _FACTORY_H#define _FACTORY_H#include "Product.h"class Factory {public:    virtual Product* creator() = 0;};#endif // _FACTORY_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Factory.cpp@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Factory.h"#include <iostream>Product* Factory::creator() {    return NULL;}
抽象产品类:

/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Product.h@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _PRODUCT_H#define _PRODUCT_Hclass Product {public:    virtual void property1() = 0;    virtual void property2() = 0;    virtual void property3() = 0;};#endif // _PRODUCT_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:Product.cpp@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Product.h"void Product::property1() {}void Product::property2() {}void Product::property3() {}
具体工厂类:

/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:concreteFactory.h@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _CONCRETEFACTORY_H#define _CONCRETEFACTORY_H#include "Factory.h"#include "Product.h"class concreteFactoryA : public Factory {    virtual Product* creator();};class concreteFactoryB : public Factory {    virtual Product* creator();};class concreteFactoryC : public Factory {    virtual Product* creator();};#endif // _COMCRETEFACTORY_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:concreteFactory.cpp@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "Product.h"#include "concreteFactory.h"#include "concreteProduct.h"Product* concreteFactoryA::creator() {    return new concreteProductA();}Product* concreteFactoryB::creator() {    return new concreteProductB();}Product* concreteFactoryC::creator() {    return new concreteProductC();}

具体产品类:

/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:concreteProduct.h@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#ifndef _CONCRETEPRODUCT_H#define _CONCRETEPRODUCT_H#include "Product.h"#include <iostream>class concreteProductA : public Product {private:    std::string name;public:    concreteProductA();    virtual void property1();    virtual void property2();    virtual void property3();};class concreteProductB : public Product {private:    std::string name;public:    concreteProductB();    virtual void property1();    virtual void property2();    virtual void property3();};class concreteProductC : public Product {private:    std::string name;public:    concreteProductC();    virtual void property1();    virtual void property2();    virtual void property3();};#endif // _CONCRETEPRODUCT_H
/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:concreteProduct.cpp@datetime:2016.09.11@author:HJS@e-mail:jingshuang_hu@163.com@blog:http://blog.csdn.net/hujingshuang*****************************************/#include "concreteProduct.h"#include <iostream>#include <string>using namespace std;concreteProductA::concreteProductA() {    name = "A";}void concreteProductA::property1() {    cout << name << "属性1" << endl;}void concreteProductA::property2() {    cout << name << "属性2" << endl;}void concreteProductA::property3() {    cout << name << "属性3" << endl;}// concreteProductB::concreteProductB() {    name = "B";}void concreteProductB::property1() {    cout << name << "属性1" << endl;}void concreteProductB::property2() {    cout << name << "属性2" << endl;}void concreteProductB::property3() {    cout << name << "属性3" << endl;}// concreteProductC::concreteProductC() {    name = "C";}void concreteProductC::property1() {    cout << name << "属性1" << endl;}void concreteProductC::property2() {    cout << name << "属性2" << endl;}void concreteProductC::property3() {    cout << name << "属性3" << endl;}

1 0