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

简介

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

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

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

工厂模式

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

以下为一个工厂类的实例:
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的,觉得麻烦就没写了后面有时间就补)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剑指offer之左旋转字符串

1 题目 字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部&#xff0c;比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab 2 思路 先反转字符串所有&#xff0c;通过数字n找到的边界 ,然后再反转字符串部分左边和部分右边。 3 代码实现 #include <s…

如何科学的组织React组件样式

React的组件式开发&#xff0c;让我们可以利用其Component Model&#xff0c;专注于单个组件的逻辑开发&#xff0c;其中还包括组织组件的样式。先声明&#xff0c;本文并不是webpack配置教程&#xff0c;不会介绍详细的配置过程&#xff0c;假设你们已经用过了css-loader styl…

C#语法糖系列 —— 第三篇:聊聊闭包的底层玩法

有朋友好奇为什么将 闭包 归于语法糖&#xff0c;这里简单声明下&#xff0c;C# 中的所有闭包最终都会归结于 类 和 方法&#xff0c;为什么这么说&#xff0c;因为 C# 的基因就已经决定了&#xff0c;如果大家了解 CLR 的话应该知道&#xff0c; C#中的类最终都会用 MethodTab…

空间数据库Spatial Tools的使用

工具下载:http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools 该工具为绿色版,点击即可使用。 1、导入Shapefile数据 双击“Shape2Sql.exe”,打开界面如下: 2、查询空间数据 双击打开“SqlSpatial.exe”

IBM与博世合作打造轻松的工业物联网

计算业巨头c公司和物联网技术提供商博世集团&#xff08;Bosch Group&#xff09;宣布达成合作&#xff0c;让客户的开发和运营团队更轻松地管理物联网设备。 作为合作的一部分&#xff0c;博世将在IBM Bluemix云计算服务中提供Bosch物联网套件&#xff0c;并与IBM Watson物联网…

自定义View 进度条

1.在values下面新建一个attrs.xml&#xff0c;现在里面定义我们的自定义属性&#xff0c; <?xml version"1.0" encoding"utf-8"?> <resources><declare-styleable name"RoundProgressBar"><attr name"roundColor&qu…

python图形绘制库turtle中文开发文档及示例大全【最详细、连结果图都有,gif格式的!】

前言 本文参考&#xff1a;Python库官方文档 本文例子摘抄自Python库官方文档&#xff0c;为了方便讲解&#xff0c;个人进行了修改&#xff0c;并且相关函数说明不完全参照文档&#xff0c;在结果处贴出了执行结果&#xff0c;不方便用jpg等图片作为展示的用了gif格式图片进行…

剑指offer之和为s的数组

1 问题 输入一个递增排序数组和数字和s,在数组里面找2个数&#xff0c;他们的和是s,如果有多对&#xff0c;只需要输出一对。 比如数组{1, 2, 4, 7, 11, 15}&#xff0c;我们输出4 &#xff0c;11 2 思路 我们定义2个首尾指针&#xff0c;先是115&#xff0c;大于15&#xff…

oracle 事务_从Oracle到PG-PostgreSQL的MVCC机制简介

作者&#xff1a;甘植恳-AkenPostgreSQL和Oracle、MySQL等RDBMS一样&#xff0c;都有自己的并发控制机制。而并发控制的目的是为了在多个事务同时运行时保持事务ACID属性。MVCC即Multi-version concurrence control首字母缩写&#xff0c;MVCC会为每个数据更改操作创建数据块或…

【Microstation】不能从对话框中装载/创建类型为 ‘HTML‘,id =41510001 的对话框条目,该对话框为: “文本编辑器 - 字处理器“,GCSDIALOG 已装载。

在Win7上安装MicroStation V8i简体中文版,在添加文字图层的时候,点击出现提示“不能从对话框中装载/创建类型为 HTML,id =41510001 的对话框条目,该对话框为: "文本编辑器 - 字处理器",GCSDIALOG 已装载。”,问题出在Win7对该软件的兼容性上。 MS软件提供了三种…

fastdfs 一个group内实现按照不同的项目,指定路径存储.

为什么80%的码农都做不了架构师&#xff1f;>>> 环境介绍: 1: 公司目前有5个项目 A B C D E 日后可能会有所增加. 2: 使用fastdfs存储这5各项目的文件,要求各各项目的文件分开存储,也就是每个项目的文件存储到一个固定的位置. 3: 三台机器ip地址分配如下 tracker…

一个WPF开发的打印对话框-PrintDialogX

今天五月一号&#xff0c;大家玩的开心哦。1. 介绍今天介绍一个WPF开发的打印对话框开源项目-PrintDialogX[1]&#xff0c;该开源项目由《WPF开源项目&#xff1a;AIStudio.Wpf.AClient》[2]作者推荐。欢迎使用 PrintDialogX, 这是一个开源项目。免费用于商业用途。用于 C# 的自…

这一新的可视化方法教你优雅地探索相关性

一个古老的诅咒一直萦绕着数据分析&#xff1a;我们用来改进模型的变量越多&#xff0c;那么我们需要的数据就会出现指数级的增长。不过&#xff0c;我们通过关注重要的变量就可以避免欠拟合以及降低收集大量数据的需求。减少输入变量的一种方法是鉴别其对输出变量的影响。变量…

cannot fetch plan for SQL_ID: 5qgz1p0cut7mx, CHILD_NUMBER: 0

SQL>set serveroutput off --一定要关SQL> select * from table(dbms_xplan.display_cursor(null,null,ADVANCED));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------…

【新手宝典】一篇博文带萌新建站并了解建站体系流程和对萌新友好的便捷方式,这篇博文很有可能是你的启蒙文

前言 本片博文主要面向于还没接触过web开发的萌新&#xff0c;以及想知道整体流程并且完成建站的萌新&#xff1b;如果你是个大佬&#xff0c;就没必要看下去了。 本篇博文没有难啃的骨头&#xff0c;请各位萌新放心食用。 本篇博文采用通俗易懂的方式讲解&#xff0c;轻松并…

剑指offer之剪绳子问题

1 问题 给你一根长度为n的绳子&#xff0c;请把绳子剪成m段 (m和n都是整数&#xff0c;n>1并且m>1)每段绳子的长度记为k[0],k[1],…,k[m]. 请问k[0] * k[1] …k[m]可能的最大乘积是多少&#xff1f; 例如&#xff0c;当绳子的长度为8时&#xff0c;我们把它剪成长度分别…

计算机打字比赛活动策划书怎么写,打字比赛策划书范文.docx

打字比赛策划书范文第 PAGE \* Arabic \* MERGEFORMAT 7 页打字比赛策划书范文打字比赛策划书(一)一、比赛简介&#xff1a;为了丰富大学生的课余生活&#xff0c;提高学生动手能力和综合素质&#xff0c;本协会面对全体协会成员开展此项打字比赛活动。此项活动为我协会电脑培训…

okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...

之前上传图片都是直接将图片转化为io流传给服务器&#xff0c;没有用框架传图片。最近做项目&#xff0c;打算换个方法上传图片。Android发展到现在&#xff0c;Okhttp显得越来越重要&#xff0c;所以&#xff0c;这次我选择用Okhttp上传图片。Okhttp目前已经更新到Okhttp3版本…

MicroStation V8i简体中文版中文字体乱码解决办法

Bentley (奔特力)是一家软件研发公司,其核心业务是满足负责建造和管理全球基础设施,包括公路、桥梁、机场、摩天大楼、工业厂房和电厂以及公用事业网络等领域专业人士的需求。Bentley 在基础设施资产的整个生命周期内针对不同的职业,包括工程师、建筑师、规划师、承包商、…

剑指offer之斐波那契数列

1 问题 写一个函数&#xff0c;输入n,求斐波那契数列的第n项。斐波那契数列定义如下。 f(n) 0; (n 0)f(n) 1; (n 1)f(n) f(n - 1) f(n - 2); (n > 2); 2 分析 1) 直接用递归 2) 我们用两个变量保持每次需要计算下一个值得前面2个数&#xff0c;从最前面开始迭代。…