当前位置: 首页 > news >正文

网站设计在线培训机构河南国基建设集团有限公司网站

网站设计在线培训机构,河南国基建设集团有限公司网站,公众号推广代理,做网站合肥哪家公司好简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式#xff1f;2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式#xff1f;3.2. 定义3.3. 代码实现3.4. 主要优点3.5.… 简单工厂模式、工厂方法模式、抽象工厂模式 1. 为什么需要工厂模式2. 简单工厂模式2.1. 定义2.2. 代码实现2.3. 优点2.4. 缺点2.5. 适用场景 3. 工厂方法模式3.1. 有了简单工厂模式为什么还需要有工厂方法模式3.2. 定义3.3. 代码实现3.4. 主要优点3.5. 主要缺点3.6. 适用场景 4. 抽象工厂模式4.1. 产品等级结构与产品族4.2. 为什么需要抽象工厂模式4.3. 定义4.4. 代码实现4.5. 主要优点4.6. 主要缺点4.7. 使用场景 5. 总结 1. 为什么需要工厂模式 工厂模式Factory Pattern是一种创建型设计模式它提供了一种创建对象的方式将对象的实例化过程与客户端代码解耦即创建与使用解耦。工厂模式的主要目的是提供一种灵活的对象创建机制以便根据需求创建不同类型的对象。 以下是一些需要使用工厂模式的情况 封装对象的创建逻辑当对象的创建过程比较复杂涉及到多个步骤或依赖关系时可以使用工厂模式将对象的创建逻辑封装到工厂类中。这样客户端代码只需要与工厂类进行交互而无需了解具体的创建细节。 实现对象的解耦工厂模式可以将对象的实例化过程与客户端代码解耦使得客户端代码不需要直接依赖具体的类。客户端只需要通过工厂类来获取所需的对象使得代码更加灵活和可维护。 统一管理对象的创建通过工厂模式可以将对象的创建集中在工厂类中进行管理避免了代码中多处重复的对象创建代码。这样可以更好地控制对象的创建逻辑提高代码的复用性和可维护性。 实现产品族的创建工厂模式可以用于创建产品族即一组相关或相互依赖的产品对象。通过定义不同的工厂类来创建不同的产品族可以使得创建过程更加灵活同时也符合开闭原则方便扩展新的产品族。 2. 简单工厂模式 2.1. 定义 简单工厂模式Simple Factory Pattern定义一个工厂类它可以根据参数的不同返回不同类的实例被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态static方法因此简单工厂模式又被称为静态工厂方法Static Factory Method模式它属于类创建型模式。 2.2. 代码实现 #include iostream #include string// 抽象产品类 class Product { public:virtual void Use() 0; };// 具体产品类 A class ConcreteProductA : public Product { public:void Use() override {std::cout Using ConcreteProductA std::endl;} };// 具体产品类 B class ConcreteProductB : public Product { public:void Use() override {std::cout Using ConcreteProductB std::endl;} };// 简单工厂类 class SimpleFactory { public:// 根据传入的参数创建不同的产品对象static Product* CreateProduct(const std::string productType) {if (productType A) {return new ConcreteProductA();} else if (productType B) {return new ConcreteProductB();}return nullptr;} };int main() {// 使用简单工厂创建产品对象Product* productA SimpleFactory::CreateProduct(A);if (productA) {productA-Use();delete productA;}Product* productB SimpleFactory::CreateProduct(B);if (productB) {productB-Use();delete productB;}return 0; }2.3. 优点 工厂类包含必要的判断逻辑可以决定在什么时候创建哪一个产品类的实例。客户端可以免除直接创建产品对象的职责而仅仅“消费”产品。简单工厂模式实现了对象创建和使用的分离。客户端无须知道所创建的具体产品类的类名只需要知道具体产品类所对应的参数即可。对于一些复杂的类名通过简单工厂模式可以在一定程度减少使用者的记忆量。通过引入配置文件可以在不修改任何客户端代码的情况下更换和增加新的具体产品类在一定程度上提高了系统的灵活性。 2.4. 缺点 由于工厂类集中了所有产品的创建逻辑职责过重一旦不能正常工作整个系统都要受到影响。使用简单工厂模式势必会增加系统中类的个数引入了新的工厂类增加了系统的复杂度和理解难度。系统扩展困难。一旦添加新产品就不得不修改工厂逻辑在产品类型较多时有可能造成工厂逻辑过于复杂不利于系统的扩展和维护。简单工厂模式由于使用了静态工厂方法造成工厂角色无法形成基于继承的等级结构。 2.5. 适用场景 工厂类负责创建的对象比较少。由于创建的对象较少不会造成工厂方法中的业务逻辑太过复杂。客户端只知道传入工厂类的参数对于如何创建对象并不关心。 3. 工厂方法模式 3.1. 有了简单工厂模式为什么还需要有工厂方法模式 在简单工厂模式中只提供一个工厂类该工厂类处于对产品类进行实例化的中心位置它需要知道每个产品对象的创建细节并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入系统中时必须修改工厂类需要在其中加入必要的业务逻辑这违背了开闭原则。此外在简单工厂模式中所有的产品都由同一个工厂创建工厂类职责较重业务逻辑较为复杂具体产品与工厂类之间的耦合度高严重影响了系统的灵活性和扩展性而工厂方法模式则可以很好地解决这一问题。在工厂方法模式中不再提供一个统一的工厂类来创建所有的产品对象而是针对不同的产品提供不同的工厂系统提供一个与产品等级结构对应的工厂等级结构。工厂方法模式定义如下 3.2. 定义 工厂方法模式Factory Method Pattern定义一个用于创建对象的接口让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式Factory Pattern又可称作虚拟构造器模式Virtual Constructor Pattern或多态工厂模式Polymorphic Factory Pattern。工厂方法模式是一种类创建型模式。 3.3. 代码实现 #include iostream #include string// 抽象产品类 class Product { public:virtual void Use() 0; };// 具体产品类 A class ConcreteProductA : public Product { public:void Use() override {std::cout Using ConcreteProductA std::endl;} };// 具体产品类 B class ConcreteProductB : public Product { public:void Use() override {std::cout Using ConcreteProductB std::endl;} };// 抽象工厂类 class Factory { public:virtual Product* CreateProduct() 0; };// 具体工厂类 A class ConcreteFactoryA : public Factory { public:Product* CreateProduct() override {return new ConcreteProductA();} };// 具体工厂类 B class ConcreteFactoryB : public Factory { public:Product* CreateProduct() override {return new ConcreteProductB();} };int main() {// 使用工厂方法创建产品对象Factory* factoryA new ConcreteFactoryA();Product* productA factoryA-CreateProduct();if (productA) {productA-Use();delete productA;}delete factoryA;Factory* factoryB new ConcreteFactoryB();Product* productB factoryB-CreateProduct();if (productB) {productB-Use();delete productB;}delete factoryB;return 0; }工厂方法模式是简单工厂模式的延伸它继承了简单工厂模式的优点同时还弥补了简单工厂模式的不足。工厂方法模式是使用频率最高的设计模式之一是很多开源框架和API类库的核心模式。 3.4. 主要优点 1在工厂方法模式中工厂方法用来创建客户所需要的产品同时还向客户隐藏了哪种具体产品类将被实例化这一细节。用户只需要关心所需产品对应的工厂无须关心创建细节甚至无须知道具体产品类的类名。 2基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式正是因为所有的具体工厂类都具有同一抽象父类。 3使用工厂方法模式的另一个优点是在系统中加入新产品时无须修改抽象工厂和抽象产品提供的接口无须修改客户端也无须修改其他的具体工厂和具体产品而只要添加一个具体工厂和具体产品就可以了。这样系统的可扩展性也就变得非常好完全符合开闭原则。 3.5. 主要缺点 1在添加新产品时需要编写新的具体产品类而且还要提供与之对应的具体工厂类系统中类的个数将成对增加在一定程度上增加了系统的复杂度有更多的类需要编译和运行会给系统带来一些额外的开销。 2由于考虑到系统的可扩展性需要引入抽象层在客户端代码中均使用抽象层进行定义增加了系统的抽象性和理解难度且在实现时可能需要用到反射等技术增加了系统的实现难度 3.6. 适用场景 1客户端不知道其所需要的对象的类。在工厂方法模式中客户端不需要知道具体产品类的类名只需要知道所对应的工厂即可具体的产品对象由具体工厂类创建可将具体工厂类的类名存储在配置文件或数据库中。 2抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中抽象工厂类只需要提供一个创建产品的接口而由其子类来确定具体要创建的对象利用面向对象的多态性和里氏代换原则在程序运行时子类对象将覆盖父类对象从而使得系统更容易扩展。 4. 抽象工厂模式 工厂方法模式通过引入工厂等级结构解决了简单工厂模式中工厂类职责太重的问题。但由于工厂方法模式中的每个工厂只生产一类产品可能会导致系统中存在大量的工厂类势必会增加系统的开销。此时可以考虑将一些相关的产品组成一个“产品族”由同一个工厂来统一生产。 4.1. 产品等级结构与产品族 在工厂方法模式中具体工厂负责生产具体的产品每个具体工厂对应一种具体产品工厂方法具有唯一性。一般情况下一个具体工厂中只有一个或者一组重载的工厂方法。但是有时希望一个工厂可以提供多个产品对象而不是单一的产品对象。例如一个电器工厂它可以生产电视机、电冰箱、空调等多种电器而不是只生产某一种电器。为了更好地理解抽象工厂模式这里先引入如下两个概念1产品等级结构。产品等级结构即产品的继承结构例如一个抽象类是电视机其子类有海尔电视机、海信电视机、TCL电视机则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构抽象电视机是父类而具体品牌的电视机是其子类。2产品族。在抽象工厂模式中产品族是指由同一个工厂生产的位于不同产品等级结构中的一组产品。例如海尔电器工厂生产的海尔电视机、海尔电冰箱海尔电视机位于电视机产品等级结构中海尔电冰箱位于电冰箱产品等级结构中海尔电视机、海尔电冰箱构成了一个产品族。 只要指明一个产品所处的产品族以及它所属的等级结构就可以唯一确定这个产品。 4.2. 为什么需要抽象工厂模式 当系统所提供的工厂生产的具体产品并不是一个简单的对象而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式。抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式。抽象工厂模式与工厂方法模式最大的区别在于工厂方法模式针对的是一个产品等级结构而抽象工厂模式需要面对多个产品等级结构一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时抽象工厂模式比工厂方法模式更为简单、更有效率。 在上图中每一个具体工厂可以生产属于一个产品族的所有产品例如海尔工厂生产海尔电视机、海尔冰箱和海尔空调所生产的产品又位于不同的产品等级结构中。如果使用工厂方法模式实现上图所示结构需要提供9个具体工厂而使用抽象工厂模式只需要提供3个具体工厂极大地减少了系统中类的个数。 4.3. 定义 抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比抽象工厂模式中的具体工厂不只是创建一种产品它负责创建一族产品。 抽象工厂模式Abstract Factory Pattern提供一个创建一系列相关或相互依赖对象的接口而无须指定它们具体的类。抽象工厂模式又称为Kit模式它是一种对象创建型模式。 4.4. 代码实现 #include iostream #include string// 抽象产品类 A class AbstractProductA { public:virtual void Use() 0;virtual ~AbstractProductA() {} };// 具体产品类 A1 class ConcreteProductA1 : public AbstractProductA { public:void Use() override {std::cout Using ConcreteProductA1 std::endl;} };// 具体产品类 A2 class ConcreteProductA2 : public AbstractProductA { public:void Use() override {std::cout Using ConcreteProductA2 std::endl;} };// 抽象产品类 B class AbstractProductB { public:virtual void Use() 0;virtual ~AbstractProductB() {} };// 具体产品类 B1 class ConcreteProductB1 : public AbstractProductB { public:void Use() override {std::cout Using ConcreteProductB1 std::endl;} };// 具体产品类 B2 class ConcreteProductB2 : public AbstractProductB { public:void Use() override {std::cout Using ConcreteProductB2 std::endl;} };// 抽象工厂类 class AbstractFactory { public:virtual AbstractProductA* CreateProductA() 0;virtual AbstractProductB* CreateProductB() 0;virtual ~AbstractFactory() {} };// 具体工厂类 A class ConcreteFactoryA : public AbstractFactory { public:AbstractProductA* CreateProductA() override {return new ConcreteProductA1();}AbstractProductB* CreateProductB() override {return new ConcreteProductB1();} };// 具体工厂类 B class ConcreteFactoryB : public AbstractFactory { public:AbstractProductA* CreateProductA() override {return new ConcreteProductA2();}AbstractProductB* CreateProductB() override {return new ConcreteProductB2();} };int main() {// 使用抽象工厂创建产品对象AbstractFactory* factoryA new ConcreteFactoryA();AbstractProductA* productA factoryA-CreateProductA();AbstractProductB* productB factoryA-CreateProductB();if (productA) {productA-Use();delete productA;}if (productB) {productB-Use();delete productB;}delete factoryA;AbstractFactory* factoryB new ConcreteFactoryB();AbstractProductA* productA2 factoryB-CreateProductA();AbstractProductB* productB2 factoryB-CreateProductB();if (productA2) {productA2-Use();delete productA2;}if (productB2) {productB2-Use();delete productB2;}delete factoryB;return 0; }抽象工厂模式是工厂方法模式的进一步延伸由于它提供了功能更为强大的工厂类并且具备较好的可扩展性在软件开发中得以广泛应用尤其是在一些框架和API类库的设计中。 4.5. 主要优点 1抽象工厂模式隔离了具体类的生成使得客户并不需要知道什么被创建。由于这种隔离更换一个具体工厂就变得相对容易所有的具体工厂都实现了在抽象工厂中声明的那些公共接口因此只需改变具体工厂的实例就可以在某种程度上改变整个软件系统的行为。 2当一个产品族中的多个对象被设计成一起工作时它能够保证客户端始终只使用同一个产品族中的对象。 3增加新的产品族很方便无须修改已有系统符合开闭原则。 4.6. 主要缺点 增加新的产品等级结构麻烦需要对原有系统进行较大的修改甚至需要修改抽象层代码这显然会带来较大的不便违背了开闭原则。 4.7. 使用场景 1一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节这对于所有类型的工厂模式都是很重要的用户无须关心对象的创建过程将对象的创建和使用解耦。 2系统中有多于一个的产品族而每次只使用其中某一个产品族。可以通过配置文件等方式来使得用户可以动态改变产品族也可以很方便地增加新的产品族。 3属于同一个产品族的产品将在一起使用这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象但是它们都具有一些共同的约束。例如同一操作系统下的按钮和文本框按钮与文本框之间没有直接关系但它们都是属于某一操作系统的此时具有一个共同的约束条件操作系统的类型。 4产品等级结构稳定设计完成之后不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。 5. 总结 简单工厂模式适用于创建对象较少且变化不频繁的情况工厂方法模式适用于创建对象较多且需要灵活扩展的情况而抽象工厂模式适用于创建一组相关对象的情况。 所有的工厂模式都强调一点两个类A和B之间的关系应该仅仅是A创建B或是A使用B而不能两种关系都有。将对象的创建和使用分离也使得系统更加符合单一职责原则有利于对功能的复用和系统的维护。此外将对象的创建和使用分离还有一个好处防止用来实例化一个类的数据和代码在多个类中到处都是可以将有关创建的知识搬移到一个工厂类中。因为有时候创建一个对象不只是简单调用其构造函数还需要设置一些参数可能还需要配置环境。如果将这些代码散落在每一个创建对象的客户类中势必会出现代码重复、创建蔓延的问题而这些客户类其实无须承担对象的创建工作只需使用已创建好的对象就可以了。此时可以引入工厂类来封装对象的创建逻辑和客户代码的实例化配置选项。
http://www.hkea.cn/news/14591768/

相关文章:

  • 网站更新前知道内容网站后台管理模板免费下载
  • 钢管网站建设深圳平台设计
  • app开发需要用到哪些工具seo优化的基本流程
  • 如何建单页网站上海闸北城市建设有限公司网站
  • 邢台做网站企业把自己做的网站上传到服务器
  • 公司做网站入什么科目信息发布型网站是企业网站的什么
  • 简捷的网站开封网站优化
  • 网站优化与seo四川住房和城乡建设部网站首页
  • 建网站专用网站天津建筑工程公司有哪些
  • 如何自己做网站优化做网站建设推广好做吗
  • 鲜花网站建设结构布局网站建设7
  • 山西企业建站系统平台企业营销网站建设系统
  • 济南免费建站申请网址费用
  • 网站建设单位排名免费的ppt制作软件
  • 免费网站站长推广免费无货源代理
  • 12380网站建设存在的问题无锡建设局网站一号通
  • 重庆建网站的公司集中在哪里网站 设计 工具
  • 陕西煤化建设集团铜川分公司网站wordpress 贴吧
  • 网站建设背景及意义温州网站关键词排名
  • 1元云购网站建设如何搭建购物平台
  • 重庆最大的网站制作公司医院网站建设滞后
  • 转塘有做网站的吗设计素材网站排行榜前十名
  • 深圳宝安美容医院网站建设17货源网一件代发
  • 网站建设、百度推广株洲网站建设开发
  • 网站源代码怎么下载一级a做爰片官方网站
  • wordpress快速仿站视频教程做性视频大全在线观看网站
  • 做网站需要准备些什么做全景的网站
  • 茂港网站建设公司郑州上海做网站的公司有哪些
  • 怎样做旅游视频网站wordpress vs jumoola
  • 有什么检索标准的网站产品软文案例