软件设计模式概念篇

news/2024/9/19 9:35:21

创建型模式

1、创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
2、为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。
3、创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。



工厂方法模式(Factory Method)

模式动机:

定义一个抽象工厂类,并在具体工厂类里重写这个抽象工厂类中定义的抽象方法。抽象化的结果使这种结构可以在不修改已有具体工厂类的情况下引进新的产品。

模式定义:

1、定义一个用于创建对象的接口,让子类决定实例化哪一个类。
2、在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,将类的实例化操作延迟到子类中完成。
3、工厂方法模式属于类创建型模式。

结构


定义抽象产品接口(Product):定义一个抽象产品接口,它声明了产品对象的通用属性和方法。所有具体产品类都必须实现这个接口方法。
创建具体产品类(Concrete Product):实现抽象产品接口的具体产品类。每个具体产品类表示一种具体的产品。
定义抽象工厂接口(Creator):创建一个抽象工厂接口,该接口声明了工厂方法,用于创建产品对象。
创建具体工厂类(Concrete Creator):实现抽象工厂接口的具体工厂类,每个具体工厂类负责创建特定类型的产品。在客户端中使用工厂方法:

代码实现

#include<iostream>
#include<string>
using namespace std;//抽象产品
class Product
{
public:virtual void productMethod() = 0;
};
//具体产品1
class ConcreteProduct_Xiaomi : public Product
{void productMethod() override{cout << "小米手机生产。" << endl;}
};//具体产品2
class ConcreteProduct_Huawei : public Product
{void productMethod() override{cout << "华为手机生产。" << endl;}
};//抽象工厂
class Creator
{
public:virtual Product* factoryMethod() = 0;
};
//具体工厂1
class ConcreteCreator_Xiaomi : public Creator
{
public:Product* factoryMethod() override{return new ConcreteProduct_Xiaomi();}
};
//具体工厂2
class ConcreteCreator_Huawei : public Creator
{
public:Product* factoryMethod() override{return new ConcreteProduct_Huawei();}
};int main()
{//使用具体工厂创建具体产品Creator* Xiaomi_Fac = new ConcreteCreator_Xiaomi();Product* Xiaomi_pro = Xiaomi_Fac->factoryMethod();Xiaomi_pro->productMethod();Creator* Huawei_Fac = new ConcreteCreator_Huawei();Product* Huawei_pro = Huawei_Fac->factoryMethod();Huawei_pro->productMethod();
}

应用场景

后续补充



抽象工厂模式(Abstract Factory)

模式动机:

在工厂方法模式中,每个具体工厂对应一种具体产品。有时,我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。

抽象工厂模式定义:

1、提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、抽象工厂模式属于对象创建型模式

结构:


抽象工厂接口(Abstract Factory): 定义了一组方法,每个方法用于创建某一类对象,通常包括多个产品族的创建方法。
具体工厂类(Concrete Factory): 实现了抽象工厂接口,负责创建具体的产品对象。每个具体工厂类通常对应一个产品族。
抽象产品接口(Abstract Product): 义了一组方法,用于描述产品的通用行为。
具体产品类(Concrete Product): 实现了抽象产品接口,表示真正的产品对象。每个具体产品类属于某个产品族。

代码实现:

#include<iostream>
#include<string>
using namespace std;//抽象手机产品
class aF_ProductPhone
{
public:virtual void phoneMethod() = 0;
};
//具体产品-小米手机
class aF_ConcreteProductPhone_Xiaomi : public aF_ProductPhone
{
public:void phoneMethod() override{cout << "小米手机生产。" << endl;}
};//具体产品-华为手机
class aF_ConcreteProductPhone_Huawei : public aF_ProductPhone
{
public:void phoneMethod() override{cout << "华为手机生产。" << endl;}
};//抽象电脑产品
class aF_ProductComputer
{
public:virtual void computerMethod() = 0;
};
//具体产品-小米电脑
class aF_ConcreteProductComputer_Xiaomi : public aF_ProductComputer
{
public:void computerMethod() override{cout << "小米电脑生产。" << endl;}
};//具体产品-华为电脑
class aF_ConcreteProductComputer_Huawei : public aF_ProductComputer
{
public:void computerMethod() override{cout << "华为电脑生产。" << endl;}
};//抽象工厂
class aF_AbstractFactory
{
public:virtual aF_ProductPhone* createPhone() = 0;virtual aF_ProductComputer* createComputer() = 0;
};//具体工厂-小米
class aF_XiaomiFactory : public aF_AbstractFactory
{
public:aF_ProductPhone* createPhone() override{return new aF_ConcreteProductPhone_Xiaomi();}aF_ProductComputer* createComputer() override{return new aF_ConcreteProductComputer_Xiaomi();}
};//具体工厂-华为
class aF_HuaweiFactory : public aF_AbstractFactory
{
public:aF_ProductPhone* createPhone() override{return new aF_ConcreteProductPhone_Huawei();}aF_ProductComputer* createComputer() override{return new aF_ConcreteProductComputer_Huawei();}
};
int main()
{//小米工厂aF_AbstractFactory* xiaomiFac = new aF_XiaomiFactory();aF_ProductPhone* xiaomiPhone = xiaomiFac->createPhone();xiaomiPhone->phoneMethod();aF_ProductComputer* xiaomiComputer = xiaomiFac->createComputer();xiaomiComputer->computerMethod();//华为工厂aF_AbstractFactory* huaweiFac = new aF_HuaweiFactory();aF_ProductPhone* huaweiPhone = huaweiFac->createPhone();huaweiPhone->phoneMethod();aF_ProductComputer* huaweiComputer = huaweiFac->createComputer();huaweiComputer->computerMethod();
}

应用场景

后续补充



单例模式(Singleton Pattern)

模式动机:

对于系统中的某些类来说,有且只能有一个实例。
(1)一个系统只能有一个窗口管理器。
(2)系统中可以有许多打印机,但是只能有一个打印机正在工作。

单例模式定义:

1、确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。
2、单例模式属于对象创建型模式。
3、单例负责类的实例的创建,且是唯一的。因此,在单例类的外部无法使用new创建。否则,该类的实例对象就不是单例。

结构:

代码实现:

懒汉式单例模式:


饿汉式单例模式:


应用场景

后续补充



持续更新中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

mysql中explain命令详解

前言 我们可以使用 explain 命令来查看 SQL 语句的执行计划,从而帮助我们优化慢查询。 使用注意:使用的 mysql 版本为 8.0.28数据准备 CREATE TABLE `tb_product2` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 商品ID,`name` varchar(20) DEFAULT NULL COMMENT 商品名称,`…

vasp极化计算

为什么我算一个结构,理论上应该是右极化态的,为什么只有离子极化,没有电子极化?是铁电相构建有问题还是计算的数据有问题?

超线程/同步多线程(HT/SMT)技术

超线程/同步多线程(HT/SMT)技术 虽然现在超线程(Hyper-Threading)被大家广泛接受,并把所有一个物理核心上有多个虚拟核心的技术都叫做超线程,但这其实是Intel的一个营销名称。而实际上这一类技术的(学术/技术)通行名称是同步多线程(SMT,Simultaneous Multithreading)…

Linux基础-文件特殊权限

# day13今日安排默写昨日作业讲解文件权限篇综合知识脑图特殊权限(了解)linux提供的12个特殊权限 默认的9位权限 rwx rwx rwx还有三个隐藏的特殊权限,如下 suid 比如 /usr/bin/passwdsgidsbit 特殊权限对照表类别 suid sgid sticky字符表示 S S T出现位置 用户权限位x 用户…

【django学习-28】列表界面模板下载与上传文件

前言,我们在实际项目开发过程中,经常有列表界面,有上传功能,并且支持先下载模板,后上传 1.实现效果与前端展示<form method="post" enctype="multipart/form-data" action="/depart/multi/">{% csrf_token %}<div class="for…

AoPS - Chapter 3 More Triangles

本章主要讲解正弦定理、余弦定理、海伦公式、Stewarts Theorem。本章主要讲解正弦定理、余弦定理、海伦公式、Stewarts Theorem。 本文在没有特殊说明时,默认在 \(\triangle ABC\) 中:\(a\) 为角 \(A\) 对边,\(b\) 为角 \(B\) 对边,\(c\) 为角 \(C\) 对边。 \(r\) 为内切圆…

Apache Zeppelin 命令执行漏洞复现

漏洞描述 攻击者可以使用Shell解释器作为代码生成网关,系统org.apache.zppelin.shell.Shellnterpreter类直接调用/sh来执行命令,没有进行过滤,导致RCE漏洞。 Fofa: app="APACHE-Zeppelin" 漏洞复现: 在fofa中搜索资产,共有1238条数据匹配该漏洞需要目标站点开启…

大漠注册用法

先去官方下载必要的文件 官网:http://121.204.253.175:8088/login.asp 有的鸡肋,要充钱才可以有下载列表。。。 因为我没充钱,就去淘宝买了=.=下载这四个,然后解压解压后有这三个文件夹然后桌面新建一个文件夹,存放e项目程序(也可以去别的地方) 把这三个拖入到e程序的…