工廠方法 == 開閉原則 + 簡單工廠
一.優(yōu)點
- 實現(xiàn)了對象創(chuàng)建和使?的分離届惋。
- 系統(tǒng)的可擴展性也就變得?常好陌粹,?需修改接?和原類憔晒。
二.缺點
- 增加了類的個數(shù)偎箫,增加了系統(tǒng)的抽象性和理解難度
三.使用場景
- 調(diào)用者不知道它所需要的對象的類。
- 抽象??類通過其?類工廠來指定創(chuàng)建哪個對象缰雇。
//Fruit.h
#pragma once
#include <string>
//抽象水果類
class Fruit
{
public:
virtual std::string GetName() = 0;
};
//蘋果類:public Fruit
class Apple :public Fruit
{
public:
std::string GetName() override;
};
//香蕉類:public Fruit
class Banana :public Fruit
{
public:
std::string GetName() override;
};
//抽象工廠類
class AbstractFactory
{
public:
virtual Fruit* CreateFruit() = 0;
};
//蘋果工廠類:public AbstractFactory
class AppleFactory :public AbstractFactory
{
public:
Fruit* CreateFruit() override;
};
class BananaFactory :public AbstractFactory
{
public:
Fruit* CreateFruit() override;
};
//Fruit.cpp
#include "Fruit.h"
#include <iostream>
std::string Apple::GetName()
{
std::cout << "here is Apple" << std::endl;
return std::string("Apple");
}
std::string Banana::GetName()
{
std::cout << "here is Banana" << std::endl;
return std::string("Banana");
}
Fruit* AppleFactory::CreateFruit()
{
return new Apple;
}
Fruit* BananaFactory::CreateFruit()
{
return new Banana;
}
//main.cpp
#include "Fruit.h"
#include <iostream>
int main()
{
Fruit* apple = nullptr;
AppleFactory apple_factory;
apple = apple_factory.CreateFruit();
std::cout << apple->GetName() << std::endl;
if (apple!= nullptr)
{
delete apple;
apple = nullptr;
}
Fruit* banana = nullptr;
BananaFactory banana_factory;
banana = banana_factory.CreateFruit();
std::cout << banana->GetName() << std::endl;
if (banana != nullptr)
{
delete banana;
banana = nullptr;
}
system("pause");
return 0;
}