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

什么是设计模式以及常见的例子(如单例、工厂、观察者等)

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的主要目的是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。设计模式一般包含模式名称、问题、目的、解决方案、效果等基本要素。

设计模式根据目的(即模式是用来做什么的)可以分为三大类:创建型模式、结构型模式和行为型模式。下面分别给出几个常见的设计模式例子,包括单例模式、工厂模式和观察者模式。

1. 单例模式(Singleton Pattern)

定义:单例模式确保一个类只有一个实例,并提供一个全局访问点。

核心知识点

  • 将采用单例设计模式的类的构造方法私有化(采用private修饰)。
  • 在其内部产生该类的实例化对象,并将其封装成private static类型。
  • 定义一个静态方法返回该类的实例。

使用场景:需要确保在整个应用程序中只存在一个实例的情况,如配置管理器、线程池、缓存等。

实现方式

  • 饿汉式:类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。
  • 懒汉式:类加载时不初始化,在第一次调用getInstance()方法时才进行初始化,但存在线程安全问题,可通过synchronized关键字或双重检查锁定(Double-Check Locking)来解决。

示例代码(懒汉式,双重检查锁定):

 

cpp复制代码

class Singleton {
private:
Singleton() {} // 私有化构造方法
static Singleton* instance; // 静态成员变量,指向唯一实例
static std::mutex mtx; // 静态互斥锁
public:
static Singleton* getInstance() {
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mtx); // 加锁
if (instance == nullptr) {
instance = new Singleton(); // 创建实例
}
}
return instance;
}
// 其他业务方法
void doSomething() {
// ...
}
};
// 静态成员变量初始化
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;

注意:上述示例代码以C++风格给出,但设计模式本身是跨语言的,C++中实现单例模式可能需要考虑线程安全和资源管理等问题。

2. 工厂模式(Factory Pattern)

定义:工厂模式用于处理对象的创建,它将创建对象的任务委托给子类或专门的工厂类。

常见类型

  • 简单工厂模式:通过一个工厂类根据传入的参数决定创建哪一种类的实例。
  • 工厂方法模式:定义一个创建对象的接口,但让子类决定要实例化的类是哪一个。
  • 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

使用场景:当需要创建的对象类型较多,且具有共同的接口时;当需要将对象的创建与使用分离,以提高扩展性和可维护性时。

示例代码(工厂方法模式):

 

java复制代码

// 产品接口
interface Product {
void use();
}
// 具体产品类
class ConcreteProductA implements Product {
public void use() {
System.out.println("Product A is being used.");
}
}
class ConcreteProductB implements Product {
public void use() {
System.out.println("Product B is being used.");
}
}
// 工厂接口
interface Factory {
Product createProduct();
}
// 具体工厂类
class ConcreteFactoryA implements Factory {
public Product createProduct() {
return new ConcreteProductA();
}
}
class ConcreteFactoryB implements Factory {
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactoryA();
Product product = factory.createProduct();
product.use();
}
}

3. 观察者模式(Observer Pattern)

定义:观察者模式定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

核心角色

  • Subject(主题):被观察的对象,它维护一组依赖于它的观察者,并提供添加、删除和通知观察者的方法。
  • Observer(观察者):依赖于主题的对象,当主题状态发生变化时,观察者会得到通知并进行相应的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • IT高手修炼手册(3)程序员命令
  • 如何在Java中实现实时数据同步与更新
  • 基于springboot+vue+uniapp的高校宿舍信息管理系统小程序
  • Kotlin算法:把一个整数向上取值为最接近的2的幂指数值
  • 【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十一)-git(3)
  • 毕业季有感
  • Python 获取tiktok视频评论回复数据 api接口
  • 第二十七天 第八章 贪心算法 part01 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
  • ARMv8寄存器详解
  • 一个简单的spring+kafka生产者
  • 7.6数据结构作业
  • 下拉菜单显示年份选项(月份也适用)
  • 深入理解C#中的文件系统I/O操作
  • C++报错无法访问Private
  • 卷积神经网络(CNN)和循环神经网络(RNN) 的区别与联系
  • 【知识碎片】第三方登录弹窗效果
  • 07.Android之多媒体问题
  • Angular4 模板式表单用法以及验证
  • CSS 三角实现
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Docker: 容器互访的三种方式
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Less 日常用法
  • python学习笔记 - ThreadLocal
  • SpringBoot几种定时任务的实现方式
  • Vue组件定义
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 软件开发学习的5大技巧,你知道吗?
  • 使用权重正则化较少模型过拟合
  • 译米田引理
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (20)docke容器
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (剑指Offer)面试题34:丑数
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (转)LINQ之路
  • (转)母版页和相对路径
  • 、写入Shellcode到注册表上线
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net Core 笔试1
  • .NET DataGridView数据绑定说明
  • .Net IE10 _doPostBack 未定义
  • .NET 反射的使用
  • .NET开源快速、强大、免费的电子表格组件
  • .net生成的类,跨工程调用显示注释
  • .NET之C#编程:懒汉模式的终结,单例模式的正确打开方式
  • .net专家(张羿专栏)
  • @NestedConfigurationProperty 注解用法
  • [ IO.File ] FileSystemWatcher