设计模式1---工厂模式

1.简单工厂模式:

class Anew A
class B :   new B
自己在你写的业务函数或者创建对象时,不想创建,我只是想拿来用?

class Factory:(建一个工厂类,传入参数,让工厂知道应该创建什么类型的对象)
优点:
1,客户端和具体实现类解耦
2,对于某些对象创建过程比较复杂情况,我们不用考虑这些了
缺点:
1.简单工厂模式,增加新的功能是通过修改源代码实现,不符合开闭原则
2.这个类职责过重,这个类发生问题,会影响很多使用这个工厂的模块

简单工厂模式代码实现:

#include<iostream>
using namespace std;

//抽象水果
class AbstractFruit
{
public:
	virtual void ShowName() = 0;
};

//苹果
class Apple : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "我是苹果!" << endl;
	}
};

//香蕉
class Banana : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "我是香蕉!" << endl;
	}
};

//鸭梨
class Pear : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "我是鸭梨!" << endl;
	}
};

//水果工厂
class FruitFactory
{
public:
	static AbstractFruit* CreateFruit(string flag)
	{
		if (flag == "apple")
			return new Apple;
		else if (flag == "banana")
			return new Banana;
		else if (flag == "pear")
			return new Pear;
		else
			return NULL;
	}
};

void test()
{
                //创建过程不需要关心 直接拿来用
	FruitFactory* factory = new FruitFactory;
	AbstractFruit* fruit = factory->CreateFruit("apple");
	fruit->ShowName();
	delete fruit;

	fruit = factory->CreateFruit("banana");
	fruit->ShowName();
	delete fruit;

	fruit = factory->CreateFruit("pear");
	fruit->ShowName();
	delete fruit;
}
int main(void)
{
	test();
	return 0;
}

结果:

我是苹果!
我是香蕉!
我是鸭梨!

2.工厂方法模式=简单工厂模式+开闭原则
具体工厂A 创建: class A
抽象工厂
具体工厂B 创建: class B

                  新增具体工厂C  创建 : class C

缺点:
类的个数成倍增加,导致越来越多,增加维护成本

优点:
符合开闭原则

工厂方法模式代码:

#include<iostream>
using namespace std;

//抽象水果
class AbstractFruit
{
public:
	virtual void ShowName() = 0;
};

//苹果
class Apple : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "我是苹果!" << endl;
	}
};

//香蕉
class Banana : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "我是香蕉!" << endl;
	}
};

//鸭梨
class Pear : public AbstractFruit
{
public:
	virtual void ShowName()
	{
		cout << "我是鸭梨!" << endl;
	}
};

//抽象工厂
class AbstractFruitFactory
{
public:
	virtual AbstractFruit* CreateFruit() = 0;
};

//苹果工厂
class AppleFactory :public AbstractFruitFactory
{
public:
	AbstractFruit* CreateFruit()
	{
		return new Apple;
	 }
};

//香蕉工厂
class BananaFactory :public AbstractFruitFactory
{
public:
	AbstractFruit* CreateFruit()
	{
		return new Banana;
	}
};

//鸭梨工厂
class PearFactory :public AbstractFruitFactory
{
public:
	AbstractFruit* CreateFruit()
	{
		return new Pear;
	}
};

void test()
{
	AbstractFruitFactory* factory = NULL;
	AbstractFruit* fruit = NULL;

	//创建一个苹果工厂
	factory = new AppleFactory;
	fruit=factory->CreateFruit();
	fruit->ShowName();
	delete fruit;
	delete factory;
}
int main(void)
{
	test();
	return 0;
}

结果:

我是苹果!

3.抽象工厂模式:抽象工厂针对的产品族(横着的苹果 香蕉 鸭梨),而不是产品等级结构(竖着的所有苹果)若增加一个新的西瓜,不符合开闭原则
苹果 香蕉 鸭梨 法国的
苹果 香蕉 鸭梨 美国的
苹果 香蕉 鸭梨 中国的

中国工厂
creatApple
creatBanana
creatPear

美国工厂
creatApple
creatBanana
creatPear

法国工厂
creatApple
creatBanana
creatPear

代码:

#include<iostream>
using namespace std;

//抽象苹果
class AbstractApple
{
public:
	virtual void ShowName() = 0;
};

//中国苹果
class ChinaApple : public AbstractApple
{
public:
	virtual void ShowName()
	{
		cout << "我是中国苹果!" << endl;
	}
};

//美国苹果
class UsaApple : public AbstractApple
{
public:
	virtual void ShowName()
	{
		cout << "我是美国苹果!" << endl;
	}
};

//法国苹果
class FrenchApple : public AbstractApple
{
public:
	virtual void ShowName()
	{
		cout << "我是法国苹果!" << endl;
	}
};

//抽象香蕉
class AbstractBanana
{
public:
	virtual void ShowName() = 0;
};

//中国香蕉
class ChinaBanana : public AbstractBanana
{
public:
	virtual void ShowName()
	{
		cout << "我是中国香蕉!" << endl;
	}
};

//美国香蕉
class UsaBanana : public AbstractBanana
{
public:
	virtual void ShowName()
	{
		cout << "我是美国香蕉!" << endl;
	}
};

//法国香蕉
class FrenchBanana : public AbstractBanana
{
public:
	virtual void ShowName()
	{
		cout << "我是法国香蕉!" << endl;
	}
};

//抽象鸭梨
class AbstractPear
{
public:
	virtual void ShowName() = 0;
};

//中国鸭梨
class ChinaPear : public AbstractPear
{
public:
	virtual void ShowName()
	{
		cout << "我是中国鸭梨!" << endl;
	}
};

//美国鸭梨
class UsaPear : public AbstractPear
{
public:
	virtual void ShowName()
	{
		cout << "我是美国鸭梨!" << endl;
	}
};

//法国鸭梨
class FrechPear : public AbstractPear
{
public:
	virtual void ShowName()
	{
		cout << "我是法国鸭梨!" << endl;
	}
};

//抽象工厂 针对产品族
class AbstractFruitFactory
{
public:
	virtual AbstractApple* CreateApple() = 0;
	virtual AbstractBanana* CreateBanana() = 0;
	virtual AbstractPear* CreatePear() = 0;
};

//中国工厂
class ChinaFactory :public AbstractFruitFactory
{

public:
	virtual AbstractApple* CreateApple()
	{
		return new ChinaApple;
	}
	virtual AbstractBanana* CreateBanana()
	{
		return new ChinaBanana;
	}
	virtual AbstractPear* CreatePear()
	{
		return new ChinaPear;
	}
};


//美国工厂
class UsaFactory :public AbstractFruitFactory
{

public:
	virtual AbstractApple* CreateApple()
	{
		return new UsaApple;
	}
	virtual AbstractBanana* CreateBanana()
	{
		return new UsaBanana;
	}
	virtual AbstractPear* CreatePear()
	{
		return new UsaPear;
	}
};

//法国工厂
class FrenchFactory :public AbstractFruitFactory
{

public:
	virtual AbstractApple* CreateApple()
	{
		return new FrenchApple;
	}
	virtual AbstractBanana* CreateBanana()
	{
		return new FrenchBanana;
	}
	virtual AbstractPear* CreatePear()
	{
		return new FrechPear;
	}
};

void test()
{
	AbstractFruitFactory* factory = NULL;
	AbstractApple* apple = NULL;
	AbstractBanana* banana = NULL;
	AbstractPear* pear = NULL;

	//中国工厂
	factory = new ChinaFactory;
	apple = factory->CreateApple();
	banana = factory->CreateBanana();
	pear = factory->CreatePear();

	apple->ShowName();
	banana->ShowName();
	pear->ShowName();
}
int main(void)
{
	test();
	return 0;
}

结果:

我是中国苹果!
我是中国香蕉!
我是中国鸭梨!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值