简介

设计模式是为了解决一些出现的问题设计的解决方案。是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法。使用不同的设计模式可以解决不同的问题。
设计模式可以分为三种大类别:分别是创建型模式、结构型模式、行为型模式。

在开发中,假设不使用设计模式,可能会造成耦合度过高,会造成一定的代码冗余,而且可能会影响后续的开发进程;合理的使用适合的设计模式会提高整体的灵活性,降低后续的维护成本。

创建型模式顾名思义是处理对象创建的设计模式,降低复杂度,创建复杂对象时使用。

工厂模式

在类中实现一个接口创建指定对象,使一个类的实例化延迟到了子类。简单来说把类的创建都封装起来,只需要调用一个子类方法就可以实现类的创建,并不会暴露创建类的逻辑。

以下为一个工厂类的实例:
python代码如下:

#原创不易多多支持
#Blog:https://me.csdn.net/A757291228
class Factory:def getFruit(self, name, color, taste ):if name == 'apple':return Apple(color,taste)class Fruit:def __init__(self):print("水果类初始化")def get_color(self):return self.colordef get_taste(self):return self.tasteclass Apple(Fruit):def __init__(self,color,taste):print("苹果初始化")self.color = colorself.taste = tasteclass Banana(Fruit):def __init__(self,color,taste):print("香蕉初始化")self.color = colorself.taste = tasteif __name__ == '__main__':factory = Factory()appleClass = factory.getFruit("apple", "green", "sweet")print('苹果的颜色',appleClass.get_color(),'苹果的味道',appleClass.get_taste())

C++代码如下:

//原创不易,多多支持
//Blog:https://me.csdn.net/A757291228#include <iostream>
using namespace std;class Fruit {public:string color;string taste;Fruit() {}
};class Apple : public Fruit {public:Apple(string color, string taste) {this->color = color;this->taste = taste;cout << "苹果类创建"<< endl;}
};class Factory {public:Fruit* getFruit(string name, string color, string taste){if (name == "apple") {return new Apple(color, taste);}}
};int main(){Factory* factory = new Factory();Fruit* apple=factory->getFruit("apple", "红","甜的");cout << "苹果的味道"<< apple ->color<< endl;
}

从以上代码实例可以看出,每次新建类,只需要知道类的特定标号,或者说特定的名称即可,不需要关心类的实现逻辑,在一定程度上减少了代码冗余,减少了重复做功;但是,也暴露了一个问题:每次要新增一个类,都需要在工厂类中去实现逻辑,也增强了之间的耦合度,所有的类的创建都给了一个工厂去进行,当你的类的种类繁多时,你的代码会显得臃肿不堪,所以设计模式需要考量当前项目需求是否符合此模式再进行使用。

抽象工厂模式

单独的一个工厂去创建所有类型的类会显得这个工厂臃肿不堪,那么创建多个工厂不就ok了?每个工厂都做一种类别的事情。就像上班一样,有前端后端、UI、运维一样,每个人都分工合作,这样就很有调理了。

抽象工厂很好的解决了这个问题。以下为抽象工厂示例代码。
以下代码从以上的示例代码基础上,增加了绘制;

根据上面代码进行修改,我们定义几个食物基类Food;定义其它几个类别,例如水果、主食以及蔬菜,这是几种不同类别的食物。再定3个工厂,分别用来处理不同的食物,这样就不用担心所有的类都放一个工厂进行处理了,最后再定义一个抽象工厂类,这个类对所有的工厂进行一个统一封装,这样就实现了抽象工厂类。

python代码:

#抽象工厂,主工厂
#原创不易,多多支持
#Blog:https://me.csdn.net/A757291228
class MainFactory:def getFactory(self,factory_name):if factory_name=='Fruit':return FruitFactory()elif factory_name=='Vegetables':return VegetablesFactory()elif factory_name=='Staple':return StapleFactory()
#工厂类
class FruitFactory:def getFruit(self, name, color, taste ):if name == 'apple':return Apple(color,taste)
class VegetablesFactory:def getFruit(self, name, color, taste ):if name == 'carrot':return Carrot(color,taste)
class StapleFactory:def getFruit(self, name, color, taste ):if name == 'rice':return Rice(color,taste)#Food 基类
class Food:def __init__(self,taste):print("食物类初始化")self.taste = taste
#水果主食和蔬菜三个基类
class Fruit(Food):def __init__(self):print("水果类初始化")def get_color(self):return self.colordef get_taste(self):return self.tasteclass Vegetables(Food):def __init__(self):print("蔬菜类初始化")def get_color(self):return self.colordef get_taste(self):return self.tasteclass Staple(Food):def __init__(self):print("主食类初始化")def get_color(self):return self.colordef get_taste(self): return self.taste
#具体类别
class Apple(Fruit):def __init__(self,color,taste):print("苹果初始化")self.color = colorself.taste = taste
class Rice(Staple):def __init__(self,color,taste):print("米饭初始化")self.color = colorself.taste = tasteclass Carrot(Vegetables):def __init__(self,color,taste):print("红萝卜初始化")self.color = colorself.taste = tasteif __name__ == '__main__':mainFactory = MainFactory()fruitFactory=mainFactory.getFactory('Fruit')apple=fruitFactory.getFruit("apple", "green", "sweet")print('苹果的颜色:',apple.color,'苹果的口味:',apple.taste)

C++实现:

#include <iostream>
using namespace std;
//原创不易,多多支持
//Blog:https://me.csdn.net/A757291228//食物基类
class Food {public:string color;string taste;Food() {}
};//三个类别
class Fruit :public Food {public:Fruit() {}
};class Vegetables :public Food {public:Vegetables() {}
};class Staple :public Food {public:Staple() {}
};
//三个具体类
class Apple : public Fruit {public:Apple(string color, string taste) {this->color = color;this->taste = taste;cout << "苹果类创建" << endl;}
};class Rice : public Staple {public:Rice(string color, string taste) {this->color = color;this->taste = taste;cout << "苹果类创建" << endl;}
};class Carrot : public Vegetables {public:Carrot(string color, string taste) {this->color = color;this->taste = taste;cout << "苹果类创建" << endl;}
};//工厂基类
class Factory {public:virtual Food* getFood(){}
};
//具体工厂类
class FruitFactory {public:Food* getFood(string name, string color, string taste){if (name == "apple") {return new Apple(color, taste);}}
};
class StapleFactory {public:Food* getFood(string name, string color, string taste){if (name == "apple") {return new Apple(color, taste);}}
};
class VegetablesFactory {public:Fruit* getFood(string name, string color, string taste){if (name == "apple") {return new Apple(color, taste);}}
};
//主工厂,抽象工厂
class MainFactory {public:FruitFactory* getFactory(string factory_name){if (factory_name == "Fruit") {return new FruitFactory();}}
};int main() {MainFactory* main_factory = new MainFactory();FruitFactory* fruit = main_factory->getFactory("Fruit");Food* apple = fruit->getFood("apple", "红", "甜甜的");cout << "苹果的味道" << apple->taste << endl;
}

以上代码都通过了抽象工厂进行统一的不同属性的工厂调用,增强了逻辑和结构。

看到这里了点个赞呗~(本来说要加C#和Java的,觉得麻烦就没写了后面有时间就补)

(创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现相关推荐

  1. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  2. 抽象工厂模式_设计模式系列—抽象工厂模式

    前言 23种设计模式速记 单例(singleton)模式 工厂方法(factory method)模式 23种设计模式快速记忆的请看上面第一篇,前面说完了工厂方法模式,我们发现工厂方法模式存在一个严重 ...

  3. 抽象工厂模式_设计模式(3) 抽象工厂模式

    抽象工厂模式 优化抽象工厂 异步工厂 在学习抽象工厂模式前,先来回顾一下前面的简单工厂和工厂方法模式.简单工厂的职责非常简单:构造某个实体类型,然后把实例作为抽象类型返回: 工厂方法模式则进一步抽象出 ...

  4. java 工厂模式的写法_Java23种设计模式之抽象工厂模式

    概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  5. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  6. C++设计模式之抽象工厂模式

    问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  7. 设计模式——4.抽象工厂模式

    1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一 ...

  8. 设计模式 之 抽象工厂模式

    项目源码:https://gitee.com/Jacob-gitee/DesignMode 个人博客 :https://jacob.org.cn 女娲的失误 工厂模式中讲了女娲造人的故事.人是造出来了 ...

  9. 抽象工厂模式设计模式_抽象工厂设计模式解释

    抽象工厂模式设计模式 抽象工厂设计模式是工厂设计模式的另一种形式. 这种模式可以被视为"超级工厂"或"工厂工厂". 抽象工厂设计模式(属于"四人帮&q ...

  10. Android设计模式之——抽象工厂模式

    一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定 ...

最新文章

  1. NumPy迎来重大版本更新,新增函数注释、滑动窗口视图功能,仅支持Python 3.7以上版本...
  2. 2021年春季学期-信号与系统-第四次作业参考答案-MATLAB实验1
  3. error: unknown host service 的详细解决办法
  4. python 比较两个字符串
  5. a byte of python-《A Byte of Python》笔记
  6. JS replace()方法-字符串首字母大写
  7. mvc4 利用filters特性来 实现自己的权限验证 之二
  8. android查看wifi是否双频,Android判断wifi是5G还是2.4G
  9. 如何将exe文件在linux下执行,如何在Linux系统下查找可执行文件
  10. 解决eclipse刚启动卡死的问题~~~亲测有效~~
  11. HDU 2277 Change the ball
  12. postman测试websocket_还在手工写接口测试文档,已经out了
  13. 编程大讲坛 坛坛是佳酿--编程大讲坛:C语言核心开发技术从入门到精通
  14. php安装ziparchive扩展,记一次PHP扩展-ZipArchive安装
  15. LXR和 SourceInsight
  16. 【软件构造】小谈designing patterns
  17. 京东7亿美元投资兴盛优选,买到了什么?
  18. for循环中抛出异常_不要抛出循环!
  19. 构建私有云时,需要考虑哪些问题?
  20. 看完你就知道什么是瞎忙与高效

热门文章

  1. 技术分享 | jaeger链路日志实现
  2. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)
  3. 虚虚实实,亦假亦真的 ValueTuple,绝对能眩晕你
  4. 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题
  5. Magicodes.SwaggerUI 已支持.NET Core 3.1
  6. 在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
  7. C#小游戏—钢铁侠VS太空侵略者
  8. “兼职”运维的常用命令
  9. 「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...
  10. 一个实时收集MySql变更记录的组件CanalSharp.AspNetCore