工厂模式(简单工厂、工厂和抽象工厂) C++

c++简单工厂模式、工厂方法模式与抽象工厂模式的实现和优缺点 简单工厂模式工厂方法模式抽象工厂模式 阅读详情

今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军、吕震宇 老师的文章更是堪称经典。他们的文笔如行云流水,例子活泼生动,讲解深入浅出。好在他们都是用C#描述,也没有提供必要的源码下载,所以我这里用C++实现。首先我想声明的是我的文笔绝对不如他们的好,例子也没有他们的形象,不过我打算把C++的代码实现和类图提供给大家,就算作为一种补充吧。

       开始设计模式自然而然到提到几个原则:I、开闭法则(OCP);II、里氏代换法则(LSP);III、依赖倒置法则(DIP);IV、接口隔离法则(ISP);V、合成/聚合复用原则(CARP);VI、迪米特法则(LoD),这几个法则在吕震宇 老师的设计模式(二)和设计模式(三)中有非常详尽的阐述和深入浅出的举例分析。有兴趣的朋友打开链接看一下就可以了。

      补充说明:

  • 我这里所以代码都是用VS2005的C++编译器实现。所以不能保证在其他IDE中能顺利编译,但是我想如果你使用其他编译器,也应该不会有太大问题,主要也应该是stdafx.h文件中包含的头文件问题。
  • 里面出行的结构图都是用微软的Visio2003 绘制,大家下载后可以直接用Visio打开。
  • 在以后所有的模式例子中都有客户程序,客户程序这个角色不是模式本身的内容,它是模式之外的部分,但是正是这个客户程序完成了对模式的使用,模式本身的结构是讲解的重点,但是客户程序如何使用模式也是理解模式的一个重要方面,因此在我后续的介绍中都有客户程序这个角色,并会说明究竟调用模式中的哪些角色完成对模式的使用。

简单工厂模式

生活例子

      吃饭是人的基本需求,如果人类不需要吃饭,可能我们就能活得清闲许多,也就不需要像现在一样没日没夜的工作,学习。我们学习是为了找到更好的工作,好工作为了赚更多的钱,最终为了吃饱饭,吃好饭。因此可以说吃饭是与人息息相关,下面就从吃饭的例子来引入工厂模式的学习。

           如果你想吃饭了,怎么办自己做吗?自己做就相当于程序中直接使用new。当然是自己下个指令,别人来做更爽。那就把做饭的任务交给你的老婆吧,那么她就是一个做饭的工厂了,你告诉她要要吃红烧肉,等会她就从厨房给你端出来一盘香喷喷的红烧肉了,再来个清蒸鱼吧,大鱼大肉不能太多,那就再来个爆炒空心菜,最后再来个西红柿鸡蛋汤。下图 1) 就是这个问题的模型。

C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)  - 睡仔 - C++程序员 

(图1)

       显然到了这里,你是Client,你老婆就是工厂,她拥有做红烧肉的方法,做清蒸鱼的方法,做爆炒空心菜、西红柿鸡蛋汤的方法,这些方法返回值就是食物抽象。红烧肉、清蒸鱼、爆炒空心菜、西红柿鸡蛋汤就是食物的继承类,到这里你就可以大吃二喝了。简单工厂模式也成型了。哈哈,娶一个手艺不错的老婆还真好,吃的好,吃的爽,又清闲。

       下面来看标准的简单工厂模式的分析。 

意图

把一系列拥有共同特征的产品的创建封装

结构图

C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)  - 睡仔 - C++程序员 

            (图2)

角色分析

产品基类: 工厂创建的所有产品的基类, 它负责描述所有实例所共有的公共接口。它用来作为工厂方法的返回参数。

代码实现:

//---这时一个系列的产品基类class Product{protected:Product(void);public:virtual ~Product(void);public:virtual void Function() = 0;};//cppProduct::Product(void){}Product::~Product(void){}具体产品类:产品1和产品2,这个角色实现了抽象产品角色所定义的接口。

代码实现:

//产品Aclass ConcreteProductA:public Product{public:ConcreteProductA(void);public:virtual ~ConcreteProductA(void);public:virtual void Function();};//cppConcreteProductA::ConcreteProductA(){cout<<"创建 A 产品"<<endl;}ConcreteProductA::~ConcreteProductA(){cout<<"释放 A 产品"<<endl;}void ConcreteProductA::Function(){cout<<"这是产品 A 具有的基本功能"<<endl;}//产品B与A类似不这里不再给出,大家可以下载源码

工厂类:负责具体产品的创建,有两种方式实现产品的创建,I、创建不同的产品用不同的方法;II、创建不同产品用相同的方法,然后通过传递参数实现不同产品的创建。本实例中两种模式都给出了,大家自行分析。

//简单工厂,此类不需要继承,直接硬编码实现生成的产品class SimpleFactory{public:SimpleFactory(){}public:~SimpleFactory(){}public:Product *CreateProduct(int ProuctType);Product *CreateProductA();Product *CreateProductB();};//CPPProduct * SimpleFactory::CreateProduct(int ProductType=0){Product *p = 0;switch(ProductType){case 0:p= new ConcreteProductA();break;case 1:p= new ConcreteProductB();break;default:p= new ConcreteProductA();break;}return p;}Product *SimpleFactory::CreateProductA(){return new ConcreteProductA();}Product *SimpleFactory::CreateProductB(){return new ConcreteProductB();}客户端程序:访问的角色包括产品基类、工厂类。不直接访问具体产品类。通过基类指针的多态实现产品功能的调用。

访问描述:客户程序通过调用工厂的方法返回抽象产品,然后执行产品的方法。

//调用代码SimpleFactory sf;Product *p = sf.CreateProductA();p->Function();delete p;p = sf.CreateProductB();p->Function();delete p;

优缺点说明

优点:1) 首先解决了代码中大量New的问题。为何要解决这个问题,好处的说明我想放到结尾总结中。

          2) 用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。

缺点:对修改不封闭,新增加产品您要修改工厂。违法了鼎鼎大名的开闭法则(OCP)。

附加说明

  • 大家可以参看 吕震宇 老师的C#设计模式(四)参看这个模式的分析,里面还给出了这个模式的两个变体,实现比较简单,有兴趣的朋友可以自行用C++实现一下。
  • 产品基类的代码中构造函数我用了Protected,而没有使用Public,主要是为了体现编码中的一个最小权限原则。说明此类不许用户直接实例化。虽然这里使用了virtual void Function() = 0;编译器也会控制不让用户直接实例化,不过我依然认为使用私有化构造函数来保护类不直接实例化是一个良好的编程风格。

工厂方法模式

生活例子:

           人是最贪得无厌的动物,老婆手艺再好,总有不会做的菜,你想吃回锅肉,怎么办,让老婆学呗,于是就给她就新增了做回锅肉的方法,以后你再想吃一个新菜,就要给你老婆新加一个方法,显然用老婆做菜的缺点也就暴露出来了,用程序设计的描述就是对修改永远不能封闭。当然优点也是有的,你有了老婆这个工厂,这些菜不用你自己做了,只要直接调用老婆这个工厂的方法就可以了。

          面对上面对修改不能封闭的问题,有没有好的解决方案吗,如果你有钱,问题就迎刃而解了,把老婆抽象变成一个基类,你多娶几个具体的老婆,分别有做鱼的,做青菜的,炖汤的老婆,如果你想吃一个新菜,就再新找个女人,从你的老婆基类继承一下,让她来做这个新菜。显然多多的老婆这是所有男人的梦想,没有办法,法律不允许,那么咱们只是为了做饭,老婆这个抽象类咱们不叫老婆了,叫做厨师吧,她的子类也自然而然的该叫做鱼的厨师、炖汤的厨师了。现在来看这个模式发生了变化,结构中多了一个厨师的抽象,抽象并不具体的加工产品了,至于是炖汤还是炖鱼,是由这个抽象工厂的继承子类来实现,现在的模式也就变成工厂方法模式了,这个上面的结构图1)就变成了下面的图3的结构了。

C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)  - 睡仔 - C++程序员

       (图3)

          现在再来分析现在的模式,显然简单工厂的缺陷解决了,新增加一个菜只需要新增加一个厨师就行了,原来的厨师还在做原来的工作,这样你的设计就对修改封闭了。你看把老婆解放出来,招聘大量的厨师到你家里这个方案多么的完美,你老婆也会爱死你了。当然前提就是你要有多多的钱噢,当然这里的钱的多少在软件领域应该看你的客户软件投资方的要求。

下面来一下标准的工厂模式的实现

意图

  • 定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
  • 上面是GOF关于此模式的意图描述,我想补充的是您可以这样理解:为了改善简单工厂对修改不能关闭的问题。

结构

  C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)  - 睡仔 - C++程序员

                         图4

角色分析

产品基类:同简单工厂的产品基类,其实就是用和简单工厂中的是同一个类,这里并没有重写。

具体产品类:也是用的简单工厂的具体产品类,为了体现对修改的关闭这里为系统新添加了一个具体产品类,就是“新产品”,代码中叫做“ConcreteProductANew”

工厂基类:定义了工厂创建产品的接口,但是没有实现,具体创建工作由其继承类实现。

代码实例

//工厂模式,此模式的工厂只定义加工产品的接口,具体生成交予其继承类实现//只有具体的继承类才确定要加工何种产品class Factory{public:Factory(void);public:virtual ~Factory(void);public:virtual Product* CreateProduct(int ProductType = 0) =0;};//CPPFactory::Factory(void){}Factory::~Factory(void){}具体工厂类:工厂基类的具体实现,由此类决定创建具体产品,这里 ConcreteFactory1 对于与图中的 工厂实现,ConcreteFactory2 对于与图中的新工厂。

下面给出实现代码

//工厂实现class ConcreteFactory1:public Factory{public:ConcreteFactory1();public:virtual ~ConcreteFactory1();public :Product* CreateProduct(int ProductType);};//新工厂,当要创建新类是实现此新工厂class ConcreteFactory2:public Factory{public:ConcreteFactory2();public:virtual ~ConcreteFactory2();public :Product* CreateProduct(int ProductType);};//CPPConcreteFactory1::ConcreteFactory1(){}ConcreteFactory1::~ConcreteFactory1(){}Product * ConcreteFactory1::CreateProduct(int ProductType = 0){Product *p = 0;switch(ProductType){case 0:p= new ConcreteProductA();break;case 1:p= new ConcreteProductB();break;default:p= new ConcreteProductA();break;}return p;}ConcreteFactory2::ConcreteFactory2(){}ConcreteFactory2::~ConcreteFactory2(){}Product * ConcreteFactory2::CreateProduct(int ProductType = 0){return new ConcreteProductANew();}客户端调用:访问角色(产品基类、工厂基类、工厂实现类)

调用描述:客户程序通过工厂基类的方法调用工厂实现类用来创建所需要的具体产品。从而实现产品功能的访问。

代码实现

Factory*fct = new ConcreteFactory1();Product *p = fct->CreateProduct(0);p->Function();delete p;p = fct->CreateProduct(1);p->Function();delete p;delete fct;fct = new ConcreteFactory2();p=fct->CreateProduct();delete p;delete fct;

优缺点分析

优点

  • 简单工厂具有的优点
  • 解决了简单工厂的修改不能关闭的问题。系统新增产品,新增一个产品工厂即可,对抽象工厂不受影响。
缺点:对于创建不同系列的产品无能为力

适用性

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

其他参考

抽象工厂模式

生活例子

      世事多变,随着时间的推移,走过的地方越来越多,你天南海北的朋友也越来越多。你发现菜原来还分了许多菜系,鲁菜、粤菜、湘菜等等,它们各有各的风味,同样是红烧肉由不同菜系出来的味道也各不相同, 你招待不同的朋友要用不同的菜系,这下难办了,你的厨师都是鲁菜风味,怎么办,广东的朋友来了吃不惯。现在我们再回到简单工厂模式(就是老婆做菜的模式),我们把红烧肉再向下继承,生成鲁菜红烧肉、粤菜红烧肉、湘菜红烧肉;清蒸鱼向下继承为鲁菜清蒸鱼、粤菜清蒸鱼、湘菜清蒸鱼,其它也以此类推。我们也修改一下老婆的这个类,不让其返回食物基类,而是返回红烧肉、清蒸鱼、爆炒空心菜、西红柿鸡蛋汤这一层次,并把这些方法抽象化,作为菜系工厂基类,然后再从此基类继承出,鲁菜工厂、粤菜工厂、湘菜工厂等等,再由这些具体工厂实现创建具体菜的工作,哈哈你如果招待广东朋友就用粤菜工厂,返回的就是一桌粤菜菜系的红烧肉、清蒸鱼、空心菜和西红柿鸡蛋汤了,你的广东朋友一定会吃的非常合乎胃口了。噢,非常好,你已经实现了抽象工厂模式了。结构模型图也变成了下图 6)的样子了。

C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)  - 睡仔 - C++程序员

                      (图6)

       现在可以看到,想新来做一个菜系,只需新聘请一个厨师就可以了,多么完美,但是你先别高兴太早,如果你想新增加一个菜就变得非常困难了。

意图

       提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

结构

C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)  - 睡仔 - C++程序员

角色分析

产品基类:这里包含产品基类A和产品基类B,实际上在我的示例代码中,这两个产品都从共同的基类继承而来,但是这个继承关系却是在这个模式之外的部分,而本身这个模式关心的是这两个产品基类的差异部分。

代码实现:这里的代码就是借用的简单工厂模式中具体产品类的代码实现部分,为了大家阅读方便,下面重新给出一下。

//产品Aclass ConcreteProductA:public Product{public:ConcreteProductA(void);public:virtual ~ConcreteProductA(void);public:virtual void Function();};//cppConcreteProductA::ConcreteProductA(){cout<<"创建 A 产品"<<endl;}ConcreteProductA::~ConcreteProductA(){cout<<"释放 A 产品"<<endl;}void ConcreteProductA::Function(){cout<<"这是产品 A 具有的基本功能"<<endl;}//产品B与A类似不这里不再给出,大家可以下载源码

具体产品类:这里的具体产品类是产品A1,A2,B1、B2等,

代码实现:A1对应的实现就是“”

class ConcreteProductA1:public ConcreteProductA{public:ConcreteProductA1(void);public:virtual ~ConcreteProductA1(void);public:virtual void Function();};//CPPConcreteProductA1::ConcreteProductA1(){cout<<"创建 A1 产品"<<endl;}ConcreteProductA1::~ConcreteProductA1(){cout<<"释放 A1 产品"<<endl;}void ConcreteProductA1::Function(){cout<<"这时产品 A1 具有的基本功能"<<endl;}

工厂抽象接口:定义了创建产品的接口,这里返回参数是返回的产品A,产品B,而本身产品A和B的共同基类,小弟认为正是这个特征构成了抽象工厂和工厂模式的区别。

代码实现

//抽象工厂模式class AbstractFactory{public:AbstractFactory();public:virtual ~AbstractFactory();public:virtual ConcreteProductA* CreateA() = 0;virtual ConcreteProductB* CreateB() = 0;};//CPPAbstractFactory::AbstractFactory(){}AbstractFactory::~AbstractFactory(){}

具体工厂实现类:工厂1和工厂2。新增加系列,只需新实现一个工厂。

代码实现: 工厂1的就是ConcreteAbsFactory1,工厂2的代码类似,这里没有给出,可以在下载代码中看到

////工厂1-----class ConcreteAbsFactory1:public AbstractFactory{public:ConcreteAbsFactory1();public:virtual ~ConcreteAbsFactory1();public:virtual ConcreteProductA* CreateA();virtual ConcreteProductB* CreateB();};//CPPConcreteAbsFactory1::ConcreteAbsFactory1(){}ConcreteAbsFactory1::~ConcreteAbsFactory1(){}ConcreteProductA* ConcreteAbsFactory1::CreateA(){return new ConcreteProductA1();}ConcreteProductB * ConcreteAbsFactory1::CreateB(){return new ConcreteProductB1();}

客户端访问: 访问角色(产品基类、抽象工厂、具体工厂实现类)

访问描述: 通过抽象工厂的指针访问具体工厂实现来创建对应系列的产品,然后通过产品基类指针访问产品功能。

调用代码:

AbstractFactory *absfct = new ConcreteAbsFactory1();ConcreteProductA *cpa = absfct->CreateA();cpa->Function();delete cpa;ConcreteProductB *cpb = absfct->CreateB();cpb->Function();delete cpb;delete absfct;absfct = new ConcreteAbsFactory2();cpa = absfct->CreateA();cpa->Function();delete cpa;cpb = absfct->CreateB();cpb->Function();delete cpb;

和工厂模式的分析比较

       现在可以和工厂模式对比一下,抽象工厂返回的接口不再是产品A和产品B的共同基类Product了,而是产品A、产品B基类(在工厂模式中它们为具体实现类,这里变成了基类)了。此时工厂的抽象和简单工厂中的工厂方法也很类似,就是这些特征区使其别于工厂模式而变成抽象工厂模式了,因此抽象工厂解决的是创建一系列有共同风格的产品(鲁菜还是粤菜),而工厂方法模式解决的创建有共同特征的一系列产品(红烧肉、清蒸鱼它们都是食物)。当然简单工厂的缺陷在抽象工厂中又再次出现了,我要新增加一个产品,工厂抽象接口就要改变了。因此抽象工厂并不比工厂模式完美,只不过是各自的适用领域不同而已。其实,这里如果把抽象工厂模式的接口返回产品A和产品B的共同基类(工厂模式返回的参数),你会发现,奇怪这个模式怎么这么眼熟,它不是恰恰退化成工厂模式了。

       类模式与对象模式的区别讨论:先看定义类“模式使用继承关系,把对象的创建延迟的子类,对象模式把对象的创建延迟到另一个对象中”。 分析:首先它们创建对象都不是在基类中完成,都是在子类中实现,因此都符合类模式的概念;但是工厂模式的创建产品对象是在编译期决定的,要调用某个工厂固定的,而抽象工厂模式对产品的创建是在运行时动态决定的,只有到运行时才确定要调用那个工厂,调用工厂随运行环境而改变。(这里我一直很混乱,欢迎大家讨论)

适用性

  • 一个系统要独立于它的产品的创建、组合和表示时
  • 一个系统要由多个 产品系列中的一个来配置时
  • 当你要强调一个系列相关的产品对象的设计以便进行联合使用时
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

参考

总结

          工厂本质就是用工厂方法替代直接New来创建对象。这里不是指的让用户重载一个新操作符号来进行创建对象的操作,而是说把New 操作封装在一个方法中,等用户需要创建对象时调用此方法而避免直接使用New而已。这样做的目的就是之一就是封装,避免代码中大量New的运算符,这当然不是主要目的,因为这样虽然New少了,CreateObject方法却多了,但是如果产品类的构造函数变了,我想常用工厂模式的修改源代码的工作应该简便许多吧,当然这算不上这个模式的好处,它的真正强大的功能其实在于适应变化,这也是整个设计模式最根本的目的;还有一点就是体现了抽象于实现的分离,当然创建型模式都具有这个特点,工厂模式非常明显吧了,把具体创建工作放置到工厂中,使客户端程序更专注与业务逻辑的,这样的代码结构也更进行合理。

《C++ 设计模式》 设计模式代表了最佳的实践,在面向对象的编程中被很多老鸟们反复使用。使用设计模式有很多好处:可重用代码、保证代码可靠性、使代码更易被他人理解 ...... 阅读详情

相关推荐

【C++设计模式】Factory 工厂模式详解(简单工厂、工厂方法、抽象工厂)

简单工厂模式的定义与特点、结构与实现; 工厂方法模式的定义与特点、结构与实现; 抽象工厂模式的定义与特点、结构与实现;

ZY-JIMMY 1948

C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)

原文地址:http://www.cnblogs.com/Seasky/archive/2009/02/06/1385609.html实例代码下载 结构类图下载        今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军、吕震宇 老师的文章更是堪称经典。他们的文笔如行云流水,例子活泼生动,讲解深入浅出。好在他们都是用C#描述,也没有提供必要

ToCpp的专栏 2275

C++设计模式:简单工厂、工厂方法、抽象工厂

简单工厂模式不能遵守开放-封闭原则,工厂和抽象工厂模式可以简单工厂模式只有一个工厂类,工厂和抽象工厂有多个工厂类工厂模式创建的产品对象相对简单,抽象工厂模式创建的产品对象相对复杂工厂模式创建的对象对应的类不需要提供抽象类【这产品类组件中没有可变因素】抽象工厂模式创建的对象对应的类有抽象的基类【这个产品类组件中有可变因素。

m0_71124168的博客 1086

C++设计模式(全23种)

设计模式概述 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。等这种思想融入到了思想中后,你就会不自觉地使用这种思想去进行你的设计和开发。 文章目录设计模式概述一、创建型模式Factory 模式(工厂模式)AbstactFactory 模式(抽象工厂模式)Singleton 模式( 单例模式)Builder 模式(建造者模式)Prototype 模式(原型模式)二、结构型模式Bridge 模式(桥接模式)总结

weixin_45712636的博客 9万+

FPGA中参数化SPI接口设计与Verilog实现

SPI(串行外设接口)作为嵌入式系统的核心通信协议,通过全双工、高速率特性在FPGA与Flash、ADC等外设交互中占据重要地位。参数化设计通过抽象时钟极性、数据位宽等可配置维度,采用分层架构实现硬件复用,显著提升开发效率。Verilog实现需重点处理跨时钟域同步和可配置帧结构,结合AXI总线集成与UVM验证方法学,可构建适应工业控制、物联网网关等场景的高可靠SPI解决方案。

ciya3282的博客 1408

智能车竞赛轮腿穿越组:GPS+IMU导航绕桩实战技巧(附避坑指南)

本文详细介绍了智能车竞赛轮腿穿越组中GPS+IMU导航绕桩的实战技巧,包括硬件选型、传感器标定、路径规划及多传感器数据融合策略。通过实际案例和避坑指南,帮助参赛队伍提升导航精度和稳定性,避免常见错误。特别强调IMU安装位置和标定对导航系统的重要性。

gin88的博客 584

C++ 常用设计模式(学习笔记)

设计模式 1、工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式作为一种创建模式,一般在创建复杂对象时,考虑使用;在创建简单对象时,建议直接new完成一个实例对象的创建。 1.1、简单工厂模式 主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。使用简单工厂模式,我们只需要知道具体的产品型号就可...

duchengjun的博客 1910

AD20丝印层导入图片logo保姆级教程(附黑白预览避坑技巧)

本文提供了一份详尽的AD20丝印层导入图片Logo的实战指南。核心在于将图片预处理为高质量的单色BMP位图,并独家分享了利用Windows画图工具进行“黑白预览”的关键技巧,以提前规避转换失真。教程涵盖了从脚本获取、图片处理、参数设置到生产规范的完整流程,帮助硬件工程师高效、准确地在PCB的Top Overlay层添加个性化标识。

weixin_29194255的博客 386

C++设计模式总结

一、单例模式 一个类不管常见多少次对象,永远只能得到该类型一个对象的实例 // p1、p2、p3指向同一对象 A* p1 = new A(); A* p2 = new A(); A* p3 = new A(); 饿汉式单例模式: 还没有获取实例对象,实例对象就已经产生了 优点:线程安全。对象存放在数据段,main函数还没有开始执行,对象就已经初始化好了,一定是线程安全的。 缺点: 获取在软件启动的时候,并没有使用到这个对象,然而这个对象已经产生,这就比较浪费资源。 #include<iostream

长期更新自学笔记 5246

Halcon Camera-calibration 相关算子(一)

Halcon Camera-calibration 相关算子介绍

qq_44744164的博客 1366

别再写爬虫了!用Trae平台5分钟搞定一个能聊天的网页数据抓取Agent

本文介绍了如何利用Trae平台快速构建无需编程的网页数据抓取智能体,实现对话式数据采集。通过自然语言指令,用户可在5分钟内完成从数据抓取到分析的全流程,显著降低技术门槛和维护成本。文章详细解析了Trae智能体的核心能力,包括自然语言理解、智能页面解析、数据清洗和可视化配置,并提供了多个实战案例,展示其在竞品监控和舆情分析中的高效应用。

weixin_29038303的博客 718

C++设计模式 - 简单工厂,工厂方法和抽象工厂

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ...

大秦坑王的专栏 2553

从零开始:如何在Windows上搭建Airsim仿真环境(避坑指南)

本文是一份详细的Windows平台AirSim仿真环境搭建指南。文章从硬件要求、Visual Studio与虚幻引擎安装开始,逐步讲解AirSim插件编译、UE项目配置,并重点介绍了通过WSL2连接PX4飞控软件实现软件在环仿真的完整流程。内容涵盖常见问题排查与性能优化,旨在帮助开发者避开常见陷阱,高效构建可用于无人机算法开发的虚拟测试平台。

earth的博客 307

【C++】简单工厂模式/工厂方法模式/抽象工厂模式

抽象工厂模式、简单工厂模式和工厂方法模式都是【创建型】设计模式,它们的核心目的都是将对象的创建和使用分离,但在实现复杂度、灵活性和应用场景上存在显著差异。以下从定义、结构、适用场景和代码示例四个方面进行对比分析。

AAADiao的博客 958

撸毛笔记-朴朴超市 v1.01

朴朴超市 v1.01脚本地址:自动签到和组队赚朴分, 朴分可以抵扣50%的金额组队瓜分需要4人成团, 每个号每天只能开团和入队各一次每天跑一两次即可使用扫码或自己想办法捉refreshToken扫码获取token: (先微信进入朴朴超市小程序并登录注册过账号再扫码)把获取的refreshToken和备注(非必须)填到文件pupuCookie.txt里(第一次运行会自动创建), 多账号换行或&或@隔开。

xiaoshun007的专栏 1810

计算三维空间中AOA定位的 CRLB(Cramér–Rao 下界,克拉美罗下界)公式与MATLAB例程

摘要:本文介绍了三维空间中基于AOA(到达角度)测量的目标定位CRLB(Cramér–Rao下界)计算方法。通过定义目标位置向量、传感器位置和AOA测量角度(方位角与俯仰角),推导了方向向量和雅可比矩阵的表达式,并构建Fisher信息矩阵计算CRLB。提供了MATLAB例程实现该算法,包括参数设置、CRLB计算和可视化(3σ误差椭球)。实验结果表明,当目标位置偏离传感器阵列时,定位误差显著增大。该方法适用于评估AOA定位系统的理论性能极限,为导航与定位算法设计提供参考。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 588

【c++】设计模式——简单工厂模式、工厂模式和抽象工厂模式

Factory模式的两个最重要的功能: (1)定义创建对象的接口,封装了对象的创建; (2)使得具体化类的工作延迟到子类当中; (一)简单工厂模式 简单工厂模式是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。 简单工厂模式的结构图: Factory Pattern是我们的工厂类,它里边有n多条生产线,每条生产线对应不同的类,生产不同的东西。对于用户,用户...

IT_Mitchell的博客 412

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++工厂模式全解析:从简单工厂到抽象工厂的进阶之路

以下,我们会详细介绍每种模式的概念、适用场景以及 C++ 实现方式。

qq_50394172的博客 1147

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

c++实现简单工厂、工厂方法、抽象工厂模式

c++实现简单工厂、工厂方法、抽象工厂模式: 题目描述: (1)、简单工厂模式 使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。 #include<iostream> using...

qq_40728028的博客 359

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

设计模式——简单工厂、工厂方法、抽象工厂介绍(附C++代码)

以下是我个人学习的笔记,如有错误恳请指出,欢迎讨论~

qq_45110569的博客 1394

设计模式之工厂模式(简单工厂模式,工厂方法,抽象工厂),使用c++实现工厂模式

工厂模式是对c++多态性质的充分使用,通过同一个基类指针能调用不同的实列化对象。优势:很好的遵循了开放-封闭的原则,对内程序内的修改是封闭的,对基类的派生类的扩展开放是允许的。如果有新的需求,只需要继承基类,增加新的派生类就可以了。减少了项目更新的时候对项目代码修改的数量,通过新增派生类就可以解决问题工厂模式总共有三种,简单工厂模式,工厂方法模式,抽象工厂模式三种,在接下来的内容中会分别对三种模式进行介绍,介绍模式是这样的,简单叙述+uml类关系图+实例代码。本文主要参考了一书。

dz131lsq的博客 396

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板

简单工厂、工厂方法和抽象工厂模式(创建型设计模式)的 C++ 代码示例模板。

夜悊的博客 678

C++设计模式——简单工厂模式、工厂模式、抽象工厂模式

1、简单工厂模式: C++设计模式——简单工厂模式 2、工厂模式: C++设计模式——工厂方法模式 3、抽象工厂模式: C++设计模式——抽象工厂模式

1482

【C/C++】设计模式——工厂模式:简单工厂、工厂方法、抽象工厂

工厂模式提供了一种封装对象创建过程的方式,使得代码更易于管理和扩展。 工厂模式隐藏了对象的具体创建过程,从而可以通过接口来创建对象,而无需关心具体的实现细节。扩展性高:工厂模式利于后期方法的维护,解耦合。 简单工厂模式(静态工厂)将对象的创建和使用分离,由一个工厂类根据传入的参数来决定创建哪一种产品类的实例,简单工厂违背了开闭原则,故将简单工厂中的工厂拆分为多个工厂:增加产品时 Factory 工厂不用改变,只需要添加对应产品类型的工厂

努力让自己的能力配得上梦想. 1230
上一篇: 工厂方法模式与抽象工厂模式的区别
下一篇: 鸭子-策略模式(Strategy Pattern)
三石先生XL
博客等级 码龄17年 119粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值