[原创][创建型模式] 简单工厂、工厂方法、抽象工厂三种设计模式的理解

[color=red][size=large][align=center]简单工厂模式[/align][/size][/color]
[color=green][b][size=medium]我的理解:[/size][/b][/color]
假设你需要更换轮胎,你可以选择去一些私人开的小店面;可以去轮胎大卖场;也可以去汽配城。
假设,你优先选择了小型的店面;由于店面空间有限所有品牌的轮胎都放在唯一的一个柜台里面。这种情况和我们的简单工厂模式很类似。

[color=green][b][size=medium]流程:[/size][/b][/color]
用户代表了客户端的行为,所以逻辑如下:
(1)用户进入店面,来到柜台前(其实就是SimpleFactory类);
(2)通过和柜台人员的沟通选择某一品牌的轮胎(类似SampleFactory中的CreateProduct),不同品牌的轮胎具有不同的代号;
(3)选择品牌后,拿出该品牌合适的轮胎(ConcreteProduct),最后提供给客户;
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661243079450997&size=800_600&devtype=web&v=1.0.1&rtick=14676158838200&share_qid=108635719&sign=5832b5ba18f39af9028cf6edfb1b8945&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661243079453101&size=800_600&devtype=web&v=1.0.1&rtick=14676158837309&share_qid=108635719&sign=0f1d87891df7b5792d2922048ac405d9&[/img]
[color=red][b]头文件[/b][/color]

//SimapleFactoryPattern.h

#ifndef SIMPLE_FACTORY_PATTERN_H
#define SIMPLE_FACTORY_PATTERN_H

#include <Windows.h>

namespace SimpleFactoryPattern
{
// Base Class
//
class AbstractProduct
{
public:
AbstractProduct();
virtual ~AbstractProduct();

virtual void DisplayProductInfo() = 0;
};


//
class ConcreteAbstractProductA : public AbstractProduct
{
public:
ConcreteAbstractProductA();
virtual ~ConcreteAbstractProductA();

virtual void DisplayProductInfo();
};

//
class ConcreteAbstractProductB : public AbstractProduct
{
public:
ConcreteAbstractProductB();
virtual ~ConcreteAbstractProductB();

virtual void DisplayProductInfo();
};

//
class SimpleFactory
{
public:
SimpleFactory();
~SimpleFactory();

static AbstractProduct* GetProduct(byte byType)
{
AbstractProduct* pTempOp = NULL;

switch(byType)
{
case 0: pTempOp = new ConcreteAbstractProductA(); break;
case 1: pTempOp = new ConcreteAbstractProductB(); break;
default: break;
}
return pTempOp;
}
};


//
void SimpleFactoryPattern_Test_0();
void SimpleFactoryPattern_Test_1();

}

#endif

[color=red][b]实现[/b][/color]

#include "SimpleFactoryPattern.h"
#include <iostream>
using namespace std;

namespace SimpleFactoryPattern
{
//
AbstractProduct::AbstractProduct()
{
}
AbstractProduct::~AbstractProduct()
{
}

//
ConcreteAbstractProductA::ConcreteAbstractProductA()
{
}
ConcreteAbstractProductA::~ConcreteAbstractProductA()
{
}
void ConcreteAbstractProductA::DisplayProductInfo()
{
cout << "ConcreteAbstractProductA \n";
}

//
ConcreteAbstractProductB::ConcreteAbstractProductB()
{
}
ConcreteAbstractProductB::~ConcreteAbstractProductB()
{
}
void ConcreteAbstractProductB::DisplayProductInfo()
{
cout << "ConcreteAbstractProductB \n";
}

//
SimpleFactory::SimpleFactory()
{
}
SimpleFactory::~SimpleFactory()
{
}

//
void SimpleFactoryPattern_Test_0()
{
AbstractProduct* pCurOP = NULL;
pCurOP = SimpleFactory::GetProduct(0);

pCurOP->DisplayProductInfo();

delete pCurOP;
pCurOP = NULL;
}

void SimpleFactoryPattern_Test_1()
{
AbstractProduct* pCurOP = NULL;
pCurOP = SimpleFactory::GetProduct(1);

pCurOP->DisplayProductInfo();

delete pCurOP;
pCurOP = NULL;
}
}


[b][color=red]客户端代码[/color][/b]

#include "SimpleFactoryPattern.h"

#include <iostream>
using namespace std;
using namespace SimpleFactoryPattern;


void main( )
{
SimpleFactoryPattern_Test_0();
SimpleFactoryPattern_Test_1();
}

[color=red][b]运行结果[/b][/color]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661259749438502&size=800_600&devtype=web&v=1.0.1&rtick=14661259839407&share_qid=108635719&sign=d6c0e09e108e108b3d01aad0d1139c09&[/img]


[color=red][size=large][align=center]工厂方法模式[/align][/size][/color]
[b][color=olive][size=medium]我的理解:[/size][/color][/b]
假设你需要更换轮胎,你可以选择去一些私人开的小店面;可以去轮胎大卖场;也可以去汽配城。
假设你的车是豪车,那么前面的小店面肯定是无法满足你的需求,你可以选择一个轮胎大卖场;这时候每一种品牌的轮胎都集中在一个柜台,这样的情况就好像工厂模式一样。一个柜台和多个柜台起本质都是柜台,也可以理解为简单工厂是工厂方法的一个特例。
[b][color=green][size=medium]流程:[/size][/color][/b]
用户代表了客户端的行为,所以逻辑如下:
(1)用户进入大型的轮胎卖场,并选择一个专卖柜台(每一个柜台其实就是一个ConcreteFactory);
(2)通过和柜台人员的沟通选择某一品牌的轮胎(ConcreteProduct);
(3)拿出该品牌合适的轮胎,最后提供给客户;
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720602900167&size=800_600&devtype=web&v=1.0.1&rtick=14661259823351&share_qid=108635719&sign=dba95a905666f795c8887004664a7de8&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661243069446399&size=800_600&devtype=web&v=1.0.1&rtick=14676158835111&share_qid=108635719&sign=b6d9213a3f8e89554dfc2d17b5b96980&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661243069448532&size=800_600&devtype=web&v=1.0.1&rtick=14676158832484&share_qid=108635719&sign=51f3af5177e72e921191bb10d8df22b1&[/img]
[b][color=red]头文件[/color][/b]

//FactoryMethodPattern.h

#ifndef FACTORY_METHOD_PATTERN_H
#define FACTORY_METHOD_PATTERN_H

#include <Windows.h>

namespace FactoryMethodPattern
{
// Base Class
//
class AbstractProduct
{
public:
AbstractProduct();
virtual ~AbstractProduct();

virtual void DisplayProductInfo() = 0;
};


// //
// class ConcreteAbstractProductA : public AbstractProduct
// {
// public:
// ConcreteAbstractProductA();
// virtual ~ConcreteAbstractProductA();
//
// virtual void DisplayProductInfo();
// };
//
// //
// class ConcreteAbstractProductB : public AbstractProduct
// {
// public:
// ConcreteAbstractProductB();
// virtual ~ConcreteAbstractProductB();
//
// virtual void DisplayProductInfo();
// };


//
class AbstractFactory
{
public:
AbstractFactory();
~AbstractFactory();

virtual AbstractProduct* GetProduct() = 0;
};

// class ConcreteFactoryA : public AbstractFactory
// {
// public:
// ConcreteFactoryA();
// virtual ~ConcreteFactoryA();
//
// virtual AbstractProduct* GetProduct();
// };
// class ConcreteFactoryB: public AbstractFactory
// {
// public:
// ConcreteFactoryB();
// virtual ~ConcreteFactoryB();
//
// virtual AbstractProduct* GetProduct() ;
// };

//
void FactoryMethodPattern_Test_A();
void FactoryMethodPattern_Test_B();

}

#endif

[b][color=red]实现[/color][/b]

#include "FactoryMethodPattern.h"
#include <iostream>
using namespace std;

namespace FactoryMethodPattern
{
//
class ConcreteAbstractProductA : public AbstractProduct
{
public:
ConcreteAbstractProductA();
virtual ~ConcreteAbstractProductA();

virtual void DisplayProductInfo();
};

//
class ConcreteAbstractProductB : public AbstractProduct
{
public:
ConcreteAbstractProductB();
virtual ~ConcreteAbstractProductB();

virtual void DisplayProductInfo();
};


class ConcreteFactoryA : public AbstractFactory
{
public:
ConcreteFactoryA();
virtual ~ConcreteFactoryA();

virtual AbstractProduct* GetProduct();
};
class ConcreteFactoryB: public AbstractFactory
{
public:
ConcreteFactoryB();
virtual ~ConcreteFactoryB();

virtual AbstractProduct* GetProduct() ;
};


//
AbstractProduct::AbstractProduct()
{
}
AbstractProduct::~AbstractProduct()
{
}

//
ConcreteAbstractProductA::ConcreteAbstractProductA()
{
}
ConcreteAbstractProductA::~ConcreteAbstractProductA()
{
}
void ConcreteAbstractProductA::DisplayProductInfo()
{
cout << "ConcreteAbstractProductA\n";
}

//
ConcreteAbstractProductB::ConcreteAbstractProductB()
{
}
ConcreteAbstractProductB::~ConcreteAbstractProductB()
{
}
void ConcreteAbstractProductB::DisplayProductInfo()
{
cout << "ConcreteAbstractProductB\n";
}


//
AbstractFactory::AbstractFactory()
{
}
AbstractFactory::~AbstractFactory()
{
}

//
ConcreteFactoryA::ConcreteFactoryA()
{
}
ConcreteFactoryA::~ConcreteFactoryA()
{
}
AbstractProduct* ConcreteFactoryA::GetProduct()
{
return new ConcreteAbstractProductA();
}

//
ConcreteFactoryB::ConcreteFactoryB()
{
}
ConcreteFactoryB::~ConcreteFactoryB()
{
}
AbstractProduct* ConcreteFactoryB::GetProduct()
{
return new ConcreteAbstractProductB();
}

//
void FactoryMethodPattern_Test_A()
{
AbstractFactory* pCurFactory = new ConcreteFactoryA();
AbstractProduct* pCurOp = pCurFactory->GetProduct();

pCurOp->DisplayProductInfo();

delete pCurOp;
pCurOp = NULL;

delete pCurFactory;
pCurFactory = NULL;
}

void FactoryMethodPattern_Test_B()
{
AbstractFactory* pCurFactory = new ConcreteFactoryB();
AbstractProduct* pCurOp = pCurFactory->GetProduct();

pCurOp->DisplayProductInfo();

delete pCurOp;
pCurOp = NULL;

delete pCurFactory;
pCurFactory = NULL;
}
}

[b][color=red]客户端代码[/color][/b]

#include "Factory.h"
#include "Product.h"
#include "FactoryMethodPattern.h"

#include <iostream>
using namespace std;
using namespace FactoryMethodPattern;

void main()
{
FactoryMethodPattern_Test_A();
FactoryMethodPattern_Test_B();
}

[color=red][b]运行结果[/b][/color]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661259749436580&size=800_600&devtype=web&v=1.0.1&rtick=14661259835428&share_qid=108635719&sign=1e7b3d1f7ec4c44542ffe7ac6ec75b85&[/img]


[color=red][size=large][align=center]抽象工厂模式[/align][/size][/color]
[color=green][b][size=medium]我的理解:[/size][/b][/color]
假设你需要更换轮胎,你可以选择去一些私人开的小店面;可以去轮胎大卖场;也可以去汽配城。
假设你还需要润滑油,你优先选择了汽配城一起购买;不然的话你可能得多跑一趟;那么这个时候你的需求就是两个,这两个需求可以理解为一个产品族,概念图如右:
[color=green][b][size=medium]流程:[/size][/b][/color]
用户代表了客户端的行为,所以逻辑如下:
(1)用户进入汽配城,选择一个轮胎专卖柜台(每一个柜台其实就是一个ConcreteFactory);
(2)通过和柜台人员的沟通选择某一品牌的轮胎(ConcreteProduct);
(3)拿出该品牌合适的轮胎,最后提供给客户;
(4)再选择一个润滑油专卖柜台(每一个柜台其实就是一个ConcreteFactory);
(5)通过和柜台人员的沟通选择某一品牌的润滑油(ConcreteProduct);
(6)拿出该品牌合适的润滑油,最后提供给客户;

[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720602900003&size=800_600&devtype=web&v=1.0.1&rtick=14661259823327&share_qid=108635719&sign=5af638a1ceb66d14883911a7e6749948&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661243049433736&size=800_600&devtype=web&v=1.0.1&rtick=14676161465014&share_qid=108635719&sign=f02a50bc7b18b6690722a3a8856d23a3&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661243049435715&size=800_600&devtype=web&v=1.0.1&rtick=14676161464510&share_qid=108635719&sign=cd091a60310162b91f19670048e8ee3a&[/img]
[b][color=red]头文件[/color][/b]

//AbstractFactoryPattern.h

#ifndef ABSTRACY_FACTORY_PATTERN_H
#define ABSTRACY_FACTORY_PATTERN_H

#include <Windows.h>
#include <string>
using namespace std;

namespace AbstractFactoryPattern
{
//
class AbstractProductA
{
public:
AbstractProductA();
virtual ~AbstractProductA();

virtual void DisplayProductAInfo() = 0;
};


// //
// class ConcreteAbstractProductA1 : public AbstractProductA
// {
// public:
// ConcreteAbstractProductA1();
// virtual ~ConcreteAbstractProductA1();
//
// virtual void DisplayProductAInfo();
// };
//
// //
// class ConcreteAbstractProductA2 : public AbstractProductA
// {
// public:
// ConcreteAbstractProductA2();
// virtual ~ConcreteAbstractProductA2();
//
// virtual void DisplayProductAInfo();
// };


//
class AbstractProductB
{
public:
AbstractProductB();
virtual ~AbstractProductB();

virtual void DisplayProductBInfo() = 0;
};


// //
// class ConcreteAbstractProductB1 : public AbstractProductB
// {
// public:
// ConcreteAbstractProductB1();
// virtual ~ConcreteAbstractProductB1();
//
// virtual void DisplayProductBInfo();
// };
//
// //
// class ConcreteAbstractProductB2 : public AbstractProductB
// {
// public:
// ConcreteAbstractProductB2();
// virtual ~ConcreteAbstractProductB2();
//
// virtual void DisplayProductBInfo();
// };


//
class AbstractFactory
{
public:
AbstractFactory();
~AbstractFactory();

virtual AbstractProductA* GetProductA() = 0;
virtual AbstractProductB* GetProductB() = 0;
};

// class ConcreteFactory1 : public AbstractFactory
// {
// public:
// ConcreteFactory1();
// virtual ~ConcreteFactory1();
//
// virtual AbstractProductA* GetProductA();
// virtual AbstractProductB* GetProductB();
// };
// class ConcreteFactory2: public AbstractFactory
// {
// public:
// ConcreteFactory2();
// virtual ~ConcreteFactory2();
//
// virtual AbstractProductA* GetProductA() ;
// virtual AbstractProductB* GetProductB();
// };

//
void AbstractFactoryPattern_Test_1();
void AbstractFactoryPattern_Test_2();

}

#endif

[b][color=red]实现[/color][/b]

#include "AbstractFactoryPattern.h"
#include <iostream>
using namespace std;

namespace AbstractFactoryPattern
{
//
class ConcreteAbstractProductA1 : public AbstractProductA
{
public:
ConcreteAbstractProductA1();
virtual ~ConcreteAbstractProductA1();

virtual void DisplayProductAInfo();
};

//
class ConcreteAbstractProductA2 : public AbstractProductA
{
public:
ConcreteAbstractProductA2();
virtual ~ConcreteAbstractProductA2();

virtual void DisplayProductAInfo();
};


//
class ConcreteAbstractProductB1 : public AbstractProductB
{
public:
ConcreteAbstractProductB1();
virtual ~ConcreteAbstractProductB1();

virtual void DisplayProductBInfo();
};


//
class ConcreteAbstractProductB2 : public AbstractProductB
{
public:
ConcreteAbstractProductB2();
virtual ~ConcreteAbstractProductB2();

virtual void DisplayProductBInfo();
};


//
class ConcreteFactory1 : public AbstractFactory
{
public:
ConcreteFactory1();
virtual ~ConcreteFactory1();

virtual AbstractProductA* GetProductA();
virtual AbstractProductB* GetProductB();
};
class ConcreteFactory2: public AbstractFactory
{
public:
ConcreteFactory2();
virtual ~ConcreteFactory2();

virtual AbstractProductA* GetProductA() ;
virtual AbstractProductB* GetProductB();
};

//
AbstractProductA::AbstractProductA()
{
}
AbstractProductA::~AbstractProductA()
{
}

ConcreteAbstractProductA1::ConcreteAbstractProductA1()
{
}
ConcreteAbstractProductA1::~ConcreteAbstractProductA1()
{
}
void ConcreteAbstractProductA1::DisplayProductAInfo()
{
cout << "ConcreteAbstractProductA1\n";
}

ConcreteAbstractProductA2::ConcreteAbstractProductA2()
{
}
ConcreteAbstractProductA2::~ConcreteAbstractProductA2()
{
}
void ConcreteAbstractProductA2::DisplayProductAInfo()
{
cout << "ConcreteAbstractProductA2\n";
}

//
AbstractProductB::AbstractProductB()
{
}
AbstractProductB::~AbstractProductB()
{
}

ConcreteAbstractProductB1::ConcreteAbstractProductB1()
{
}
ConcreteAbstractProductB1::~ConcreteAbstractProductB1()
{
}
void ConcreteAbstractProductB1::DisplayProductBInfo()
{
cout << "ConcreteAbstractProductB1\n";
}

ConcreteAbstractProductB2::ConcreteAbstractProductB2()
{
}
ConcreteAbstractProductB2::~ConcreteAbstractProductB2()
{
}
void ConcreteAbstractProductB2::DisplayProductBInfo()
{
cout << "ConcreteAbstractProductB2\n";
}


//
AbstractFactory::AbstractFactory()
{
}
AbstractFactory::~AbstractFactory()
{
}

//
ConcreteFactory1::ConcreteFactory1()
{
}
ConcreteFactory1::~ConcreteFactory1()
{
}
AbstractProductA* ConcreteFactory1::GetProductA()
{
return new ConcreteAbstractProductA1();
}
AbstractProductB* ConcreteFactory1::GetProductB()
{
return new ConcreteAbstractProductB1();
}

//
ConcreteFactory2::ConcreteFactory2()
{
}
ConcreteFactory2::~ConcreteFactory2()
{
}
AbstractProductA* ConcreteFactory2::GetProductA()
{
return new ConcreteAbstractProductA2();
}
AbstractProductB* ConcreteFactory2::GetProductB()
{
return new ConcreteAbstractProductB2();
}

//
void AbstractFactoryPattern_Test_1()
{
AbstractFactory* pCurFactory = new ConcreteFactory1();
AbstractProductA* pCurProfuctA = pCurFactory->GetProductA();
AbstractProductB* pCurProfuctB = pCurFactory->GetProductB();

pCurProfuctA->DisplayProductAInfo();
pCurProfuctB->DisplayProductBInfo();

delete pCurProfuctB;
pCurProfuctB = NULL;

delete pCurProfuctA;
pCurProfuctA = NULL;

delete pCurFactory;
pCurFactory = NULL;
}

void AbstractFactoryPattern_Test_2()
{
AbstractFactory* pCurFactory = new ConcreteFactory2();
AbstractProductA* pCurProfuctA = pCurFactory->GetProductA();
AbstractProductB* pCurProfuctB = pCurFactory->GetProductB();

pCurProfuctA->DisplayProductAInfo();
pCurProfuctB->DisplayProductBInfo();

delete pCurProfuctB;
pCurProfuctB = NULL;

delete pCurProfuctA;
pCurProfuctA = NULL;

delete pCurFactory;
pCurFactory = NULL;
}
}


[b][color=red]客户端代码[/color][/b]

#include "SimpleFactoryPattern.h"

#include <iostream>
using namespace std;
using namespace AbstractFactoryPattern;

void main()
{
AbstractFactoryPattern_Test_1();
AbstractFactoryPattern_Test_2();
}

[color=red][b]运行结果[/b][/color]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14661259749434622&size=800_600&devtype=web&v=1.0.1&rtick=14661259836990&share_qid=108635719&sign=398d4e3be18de7b3435b73bd32e00f36&[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值