网站怎么做百度的关键字,网站的设计分析,做欧美贸易的主要有哪些网站,做网站切图是什么意思重看工厂模式
之前整个设计模式的专栏是看了李建忠老师的视频#xff0c;并没有太多的自己的总结#xff0c;今天来回看一下设计模式#xff0c;重温设计模式的魅力
工厂模式我们介绍三个#xff1a; 简单工厂 工厂方法 抽象工厂
简单工厂
我们举个例子#xff0c;…重看工厂模式
之前整个设计模式的专栏是看了李建忠老师的视频并没有太多的自己的总结今天来回看一下设计模式重温设计模式的魅力
工厂模式我们介绍三个 简单工厂 工厂方法 抽象工厂
简单工厂
我们举个例子现在世界上有三场备受关注的战争。俄罗斯保护卢甘斯克和顿涅斯克独立共和国之战加沙保卫战和果敢电诈反击战。
有战争就需要武器这个时候他们需要枪炮无人机等等。他们就有了对武器的需求。
例子如下
#include iostream
#include stringusing namespace std;class Weapon
{
public:explicit Weapon(const string name) {name_ name;if (name 枪) {}else if (name 炮) {}else if (name 飞机) {}}void useWeapon() {if (name_ 枪) {cout 我是枪 endl;} else if (name_ 炮) {cout 我是炮 endl;} else if (name_ 飞机) {cout 我是飞机 endl;}}private:string name_;
};int main()
{Weapon gun Weapon(枪);Weapon cannon Weapon(炮);Weapon plane Weapon(飞机);gun.useWeapon();cannon.useWeapon();plane.useWeapon();return 0;
}从上面的例子中我们能看到如果我们需要大量型号武器的话Weapon明显会是一个巨大的类。该类设计时候存在以下的问题
在Weapon中包含了很多的if elseif 代码块整个类代码冗长增加阅读和维护难度并且大量的条件语句会影响系统的性能程序执行的时候需要进行大量判断。Weapon职责过重需要初始化和显示所有的武器对象将各种武器初始化和使用放在一个类中实现违反了单一职责原则不利于类的维护。当需要增加新型号的武器的时候必须修改weapon代码违反了开闭原则。
我们需要一种方式来创建不同的武器并且使得我们使用的时候分的清楚拿过来就用。以便我们更快获取战争的胜利。
工厂角色即简单工厂的核心用来创建所有的武器实例可以被外部直接使用创建我们需要的产品抽象产品简单工厂所有产品的父类负责描述公共接口具体产品需要创造的具体产品
如上述的例子我们需要一个武器工厂使用武器工厂来生产不同的武器则修改为如下方式
#include iostream
#include stringusing namespace std;class Weapon
{
public:virtual ~Weapon() {}virtual void useWeapon() 0;
};class Gun : public Weapon
{
public:void useWeapon() override{cout 我是枪 endl;}
};class Cannon : public Weapon
{
public:void useWeapon() override{cout 我是炮 endl;}
};class Plane : public Weapon
{
public:void useWeapon() override{cout 我是飞机 endl;}
};class Factory
{
public:Weapon *createWeapon(const std::string name){if (name 枪) {return new Gun;} else if (name 炮) {return new Cannon;} else if (name 飞机) {return new Plane;}}
};int main()
{Factory ff;Weapon* weapon nullptr;weapon ff.createWeapon(枪);weapon-useWeapon();delete weapon;weapon nullptr;weapon ff.createWeapon(炮);weapon-useWeapon();delete weapon;weapon nullptr;weapon ff.createWeapon(飞机);weapon-useWeapon();delete weapon;weapon nullptr;return 0;
}如上例子所示我们需要生产武器种类多的时候工厂就会变的臃肿。但是我们使用的时候只要抽象一个武器工厂负责生产且生产的武器我们直接拿来使用就可以。因为工厂生产的是具体的武器所以我们在使用的时候会用具体的武器去击败敌人。
简单工厂的优缺点也很明显了
优点实现了对象创建和使用的分离不需要记得具体的类名称只需要记住工厂参数即可。缺点对工厂类的依赖过重一旦工厂类不能工作整个系统会崩溃增加了系统中类的个数复杂度和理解度增加违反开闭原则添加新产品需要修改工厂逻辑工厂会越来越复杂。
简单工厂适合工厂产品较少客户端只需要告诉工厂需要生产对应的产品对如何创建不关心的场景
工厂方法
角色和对应的职责
抽象工厂工厂方法模式的核心任何工厂类都必须实现这个接口。工厂具体工厂是抽象工厂的一个实现负责具体实例化产品。抽象产品工厂方法模式所创建的所有对象的父类它负责描述所有实例所共有的接口。具体产品工厂方法所创建的具体实例对象。
我们使用简单工厂生产武器的时候工厂堆积严重因此我们需要一个工厂调度中心然后将武器分给不同的工厂分别生产代码如下
#include iostream
#include stringusing namespace std;class Weapon
{
public:virtual ~Weapon() {}virtual void useWeapon() 0;
};class Gun : public Weapon
{
public:void useWeapon() override{cout 我是枪 endl;}
};class Cannon : public Weapon
{
public:void useWeapon() override{cout 我是炮 endl;}
};class Plane : public Weapon
{
public:void useWeapon() override{cout 我是飞机 endl;}
};class AbstractFactory
{
public:virtual Weapon *createWeapon() 0;
};class GunFactory : public AbstractFactory
{
public:Weapon *createWeapon() override{return new Gun;}
};class CannonFactory : public AbstractFactory
{
public:Weapon *createWeapon() override{return new Cannon;}
};class PlaneFactory : public AbstractFactory
{
public:Weapon *createWeapon() override{return new Plane;}
};int main()
{AbstractFactory *ff nullptr;Weapon* weapon nullptr;ff new GunFactory;weapon ff-createWeapon();weapon-useWeapon();delete weapon;weapon nullptr;delete ff;ff nullptr;ff new CannonFactory;weapon ff-createWeapon();weapon-useWeapon();delete weapon;weapon nullptr;delete ff;ff nullptr;ff new PlaneFactory;weapon ff-createWeapon();weapon-useWeapon();delete weapon;weapon nullptr;delete ff;ff nullptr;return 0;
}优缺点 优点不需要记住具体的武器名字甚至不需要对应的参数实现了创建和使用的分离系统扩展性变好如果有新的武器不需要修改原来的接口和类。 缺点增加了类的数量增加了抽象性和理解难度
工厂分类明确职责清晰。如果我们某类型的武器不足只需要到对应类型的工厂去取即可。
抽象工厂方法
工厂方法通过引入工厂调度中心解决了简单工厂中工厂类职责过重的问题但是由于工厂方法中的每个工厂只生产一类产品导致我们工厂非常多肯定会增加系统的开销因此我们考虑将一些产品组成一类使用同一个工厂生产。
比如我们在俄罗斯生产一种型号的枪炮飞机在朝鲜生产另外一种型号的枪炮飞机则武器供应不断胜利就在眼前。
角色和对应的职责
抽象工厂工厂方法模式的核心任何工厂类都必须实现这个接口。工厂具体工厂是抽象工厂的一个实现负责具体实例化产品。抽象产品工厂方法模式所创建的所有对象的父类它负责描述所有实例所共有的接口。具体产品工厂方法所创建的具体实例对象。
#include iostream
#include stringusing namespace std;class WeaponGun
{
public:virtual void useWeapon() 0;
};class WeaponPlane
{
public:virtual void useWeapon() 0;
};class WeaponCannon
{
public:virtual void useWeapon() 0;
};class TMXGun : public WeaponGun
{
public:void useWeapon() override{cout 使用汤姆逊 endl;}
};
class JKSGun : public WeaponGun
{
public:void useWeapon() override{cout 使用捷克式 endl;}
};
class WeaponCannon1 : public WeaponCannon
{
public:void useWeapon() override{cout 二营长的意大利炮 endl;}
};class WeaponCannon2 : public WeaponCannon
{
public:void useWeapon() override{cout 二营长的迫击炮 endl;}
};class WeaponPlane1 : public WeaponPlane
{
public:void useWeapon() override{cout 战斗机 endl;}
};
class WeaponPlane2 : public WeaponPlane
{
public:void useWeapon() override{cout 轰炸机 endl;}
};class AbstractFactory {
public:virtual WeaponGun* createGun() 0;virtual WeaponCannon* createCannon() 0;virtual WeaponPlane* createPlane() 0;
};class RussiaFactory : public AbstractFactory
{
public:WeaponGun* createGun() override {return new TMXGun;}WeaponCannon* createCannon() override{return new WeaponCannon1;}WeaponPlane* createPlane() override{return new WeaponPlane1;}
};
class NorthKoreaFactory : public AbstractFactory
{
public:WeaponGun* createGun() override {return new JKSGun;}WeaponCannon* createCannon() override{return new WeaponCannon2;}WeaponPlane* createPlane() override{return new WeaponPlane2;}
};int main()
{AbstractFactory *factory nullptr;WeaponGun *gun nullptr;WeaponCannon *cannon nullptr;WeaponPlane *plane nullptr;factory new RussiaFactory;gun factory-createGun();cannon factory-createCannon();plane factory-createPlane();gun-useWeapon();cannon-useWeapon();plane-useWeapon();delete factory;delete gun;delete cannon;delete plane;factory new NorthKoreaFactory;gun factory-createGun();cannon factory-createCannon();plane factory-createPlane();gun-useWeapon();cannon-useWeapon();plane-useWeapon();delete factory;delete gun;delete cannon;delete plane;return 0;
}至此多地共同生产产品战争胜利近在眼前。