关于工厂模式和单例模式

embedded/2025/2/13 21:36:28/

工厂模式

        工厂模式就是将对象的创建过程封装在一个工厂类中,将创建对象的任务交给工厂完成。外部只能通过工厂类来指定创建或查找一个什么类型的对象,但不能直接创建对象。这样的好处在于实现了创建逻辑和业务逻辑的解耦。让代码变得更好看。

        工厂模式又可以细分为简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式(静态工厂)

public class AnimalFactory {public static Animal createAnimal(String type) {if ("dog".equals(type)) {return new Dog();} else if ("cat".equals(type)) {return new Cat();}throw new IllegalArgumentException("Invalid animal type!");}
}
// 使用示例
Animal dog = AnimalFactory.createAnimal("dog");

        静态工厂只能生产已经固定好的某几种类

工厂方法模式(多态工厂)

public interface AnimalFactory {Animal createAnimal();
}public class DogFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Dog();}
}public class CatFactory implements AnimalFactory {@Overridepublic Animal createAnimal() {return new Cat();}
}
// 使用示例
AnimalFactory factory = new DogFactory();
Animal dog = factory.createAnimal();

几个工厂类实现某一个父工厂接口,专门负责阐述某一种对象。类似于子公司?或者外包?

        这种工厂方法模式是用的最频繁的。(折中的艺术)。在一个抽象工厂中定义抽象产品,然后由具体的工厂区实现具体的产品。在客户端使用的时候,只需要选择对应的工厂,然后根据接口选择方法就行了,不需要关注工厂内部(产品)具体是怎么实现的。

抽象工厂模式(创建产品族):

// 定义抽象工厂
public interface AbstractFactory {Button createButton();TextField createTextField();
}// 具体工厂实现(例如 Windows 风格)
public class WindowsFactory implements AbstractFactory {@Overridepublic Button createButton() { return new WindowsButton(); }@Overridepublic TextField createTextField() { return new WindowsTextField(); }
}

基本思想和多态工厂是类似的,不过是侧重点不一样。

单例模式

单例模式就是某一个类只有一个具体的实现(对象),提供全局访问。

单例模式由饿汉式、懒汉式、静态内部类和枚举单例

饿汉式(线程安全,但可能浪费资源)

public class Singleton {private static final Singleton instance = new Singleton();private Singleton() {} // 私有构造函数public static Singleton getInstance() {return instance;}
}

将构造方法私有并且将实例用final标记,这样外部就不能再创建这个类的对象,只能用get方法请求这个类在初始化时建立的对象。

懒汉式(延迟加载,需处理线程安全)

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

不再在初始化的时候创建实例,而是用到的时候再创建,但这样就带来线程安全的问题。

静态内部类(推荐方式,线程安全且懒加载)

public class Singleton {private Singleton() {}private static class Holder {private static final Singleton instance = new Singleton();}public static Singleton getInstance() {return Holder.instance;}
}

这种是单例模式中最常用的。首先,这种模式在singleton被初始化时并不会生成对象,只有调用get方法之后才会创建holder类的对象,今儿创建一个singleton的对象,这个对象的唯一性由final关键字保证。并且也不需要像懒汉式一样使用Synchronized关键字。

枚举单例(最安全的方式,防止反射破坏单例)

public enum Singleton {INSTANCE;public void doSomething() { ... }
}

在Spring中的应用

在Spring中,混合使用了工厂方法模式和抽象工厂模式。单例模式也用了,但并不是上述的几种单例模式,而是通过Spring容器来对单例进行管理(其中单例类似于饿汉式)


http://www.ppmy.cn/embedded/161970.html

相关文章

54MAX传奇引擎源码完整二次开发母版编译教程

54MAX 传奇引擎 是传奇游戏爱好者开发或二次开发的一种游戏引擎,主要用于复刻或二次开发传奇私服。它在性能、功能扩展和可控性方面有其独特的特点。以下是对 54MAX 传奇引擎源码的原理与特点 的详细分析: 链接: https://pan.baidu.com/s/10Xgo631jONEM…

前后端分离的网页游戏,后端spring boot,前端vite+vue

1. **本地运行JAR包时出现“找不到主类”错误**: - 用户执行了java demo-0.0.1-SNAPSHOT.jar,但系统提示找不到主类。 - 正确的方式应该是使用-jar参数:java -jar demo-0.0.1-SNAPSHOT.jar。 - 需要检查JAR文件是否正确打包了Spring…

贪心算法_翻硬币

蓝桥账户中心 依次遍历 不符合条件就反转 题目要干嘛 你就干嘛 #include <bits/stdc.h>#define endl \n using namespace std;int main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin >> s;string t; cin >> t;int ret 0;for ( i…

网页版贪吃蛇小游戏开发HTML实现附源码!

项目背景 贪吃蛇是一款经典的休闲小游戏&#xff0c;因其简单易玩的机制和丰富的变形而深受玩家喜爱。本次开发目标是实现一款网页版贪吃蛇小游戏&#xff0c;并通过前端与后端结合的方式&#xff0c;提供一个流畅的在线体验。 实现过程 游戏逻辑设计 蛇的移动&#xff1a;…

图神经网络怎么和LLM结合

图神经网络怎么和LLM结合 常见的结合方式有特征融合、联合训练、任务协作等,以下是具体介绍: 特征融合 GNN为LLM提供结构化特征:在处理一些具有图结构的数据时,如知识图谱、社交网络等,先使用GNN对图数据进行处理,提取节点的特征表示,这些特征包含了图的结构信息和节点…

Linux 系统中,进程间通信机制

在 Linux 系统中&#xff0c;进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是多个进程之间交换数据和同步操作的机制。Linux 提供了多种 IPC 方式&#xff0c;每种方式适用于不同的场景。以下是常见的 IPC 方式及其详解&#xff1a; 1. 管道&#xff08…

PDF Shaper:免费多功能 PDF 工具箱,一站式满足您的 PDF 需求!

​PDF Shaper 是一款功能强大且完全免费的 PDF 工具箱&#xff0c;它几乎涵盖了日常 PDF 操作的方方面面&#xff0c;无论是转换、编辑还是处理&#xff0c;都能轻松搞定。以下是这款软件的详细介绍&#xff1a; 功能丰富&#xff0c;一应俱全 PDF 转换功能强大 PDF 转 Word&am…

PHP E-mail发送机制详解

PHP E-mail发送机制详解 引言 随着互联网的普及&#xff0c;电子邮件&#xff08;E-mail&#xff09;已经成为人们日常工作中不可或缺的通信工具。PHP作为一种流行的服务器端脚本语言&#xff0c;也提供了丰富的E-mail发送功能。本文将详细介绍PHP E-mail发送的机制&#xff…