莆田网站设计,遵义市住房和城乡建设局官方网站,宁波网络关键词优化费用,师大暨大网站建设参考#xff1a; 设计模式笔记
简单工厂模式
● 将类的创建过程交给工厂类实现#xff0c;如果需要一个类对象#xff0c;则直接通过工厂创建一个类。 ● 简单工厂模式不符合开闭原则 ● 适用场景#xff1a;工厂类负责创建的对象比较少#xff1b;客户端只知道传入工厂…参考 设计模式笔记
简单工厂模式
● 将类的创建过程交给工厂类实现如果需要一个类对象则直接通过工厂创建一个类。 ● 简单工厂模式不符合开闭原则 ● 适用场景工厂类负责创建的对象比较少客户端只知道传入工厂类的参数对于如何创建对象不关心
/*
类的创建过程交给工厂类来实现如果需要一个类的对象则直接通过工厂创建一个对应的类对象
*/
#includeiostream
using namespace std;
class AbstractFruit{
public:virtual void showName()0;
};//苹果
class Apple:public AbstractFruit{
public:virtual void showName(){couti am a apppleendl;}
};
//香蕉
class Banana:public AbstractFruit{
public:virtual void showName(){couti am a bananaendl;}
};//水果工厂
class FruitFactory{
public:static AbstractFruit*createFruit(string type){if(typeapple){return new Apple();}else if(typebanana){return new Banana();}else return nullptr;}
};int main(){FruitFactory*factorynew FruitFactory();AbstractFruit*fruitfactory-createFruit(apple);fruit-showName();//i am a apppledelete fruit;fruitfactory-createFruit(banana);fruit-showName();//i am a bananadelete fruit;delete factory;return 0;}
工厂模式简单工厂模式开闭原则
● 代码扩展时不需要修改工厂类 ● 类急速膨胀不利于维护 ● 适用场景消费者不关心它所要创建的产品类或者知道要创建的产品类二不关心如何创建的时候
/*简单工厂模式开闭原则
*/
#includeiostream
using namespace std;
class AbstractFruit{
public:virtual void showname()0;
};class Apple:public AbstractFruit{
public:virtual void showname(){couti am a appleendl;}
};class Banana:public AbstractFruit{
public:virtual void showname(){couti am a bananaendl;}
};
class Orange:public AbstractFruit{
public:virtual void showname(){couti am an orangeendl;}
};//之前是水果工厂如果要添加对象都会在工厂里面添加破坏了开闭原则
//设计成抽象工厂
class AbstractFactory{
public:virtual AbstractFruit*createFruit()0;};//苹果工厂
class AppleFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Apple();}
};//香蕉工厂
class BananaFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Banana();}
};
//橙子工厂
class OrangeFactory:public AbstractFactory{
public:virtual AbstractFruit*createFruit(){return new Orange();}
};int main(){AbstractFactory*factorynew AppleFactory();AbstractFruit*fruitfactory-createFruit();fruit-showname();//i am a appledelete factory;delete fruit;factorynew BananaFactory();fruitfactory-createFruit();fruit-showname(); //i am a bananadelete factory;delete fruit;factorynew OrangeFactory();fruitfactory-createFruit();fruit-showname();//i am an orangedelete factory;delete fruit;return 0;}
抽象工厂模式增加产品族方便
● 产品族同一产地或者同一产商功能不同 ● 产品等级功能相同产地或者产商不同 ● 不符合开闭原则增加新的产品等级麻烦甚至要在抽象层修改代码 ● 适用场景 系统中有多于一个的产品族。而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族也可以很方便地增加新的产品族。产品等级结构稳定。设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。 /*针对产品族而不是产品等级结构
*/
#includeiostream
using namespace std;
//抽象产品等级
class AbstractApple{
public:virtual void showname()0;
};
class AbstractBanana{
public:virtual void showname()0;
};
//具体产品等级
//武汉苹果
class AppleFromWhuhan:public AbstractApple{
public:virtual void showname(){cout apple frome whuhanendl;}
};
//上海苹果
class AppleFromShanghai:public AbstractApple{
public:virtual void showname(){cout apple frome shanghaiendl;}
};
//武汉香蕉
class BananaFromWhuhan:public AbstractBanana{
public:virtual void showname(){cout banana frome whuhanendl;}
};
//上海香蕉
class BananafromShanghai:public AbstractBanana{
public:virtual void showname(){coutbanana frome shanghaiendl;}
};
//抽象工厂
class AbstractFactory{
public :virtual AbstractApple*createApple()0;virtual AbstractBanana*createBanana()0;};
//武汉工厂
class WhuhanFactory:public AbstractFactory{
public:AbstractApple*createApple(){return new AppleFromWhuhan();}AbstractBanana*createBanana(){return new BananaFromWhuhan();}
};
//上海工厂
class ShanghaiFactory:public AbstractFactory{
public:AbstractApple*createApple(){return new AppleFromShanghai();}AbstractBanana*createBanana(){return new BananafromShanghai();}
};int main(){AbstractFactory*factorynullptr;AbstractApple*applenullptr;AbstractBanana*banananullptr;//武汉苹果和香蕉factorynew WhuhanFactory();applefactory-createApple();bananafactory-createBanana();apple-showname();// apple frome whuhanbanana-showname();// banana frome whuhandelete factory;delete apple;delete banana;//上海苹果和香蕉factorynew ShanghaiFactory();applefactory-createApple();bananafactory-createBanana();apple-showname();// apple frome shanghaibanana-showname();//banana frome shanghaidelete factory;delete apple;delete banana;
}