关于工厂模式和单例模式

news/2025/2/13 2:12:01/

工厂模式

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

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

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

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/news/1571582.html

相关文章

ARM Cortex-M3/M4 权威指南 笔记【一】技术综述

一、Cortex-M3/M4 处理器的一般信息 1.1 处理器类型 ARM Cortex-M 为 32 位 RISC(精简指令集)处理器,其具有: 32位寄存器32位内部数据通路32位总线接口 除了 32 位数据,Cortex-M 处理器(以及其他任何 A…

【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现

项目介绍 本课程演示的是一款 基于微信小程序的校园志愿者管理系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

自定义Spring Cloud Gateway过滤器:记录慢请求

在构建微服务架构时,API网关是一个关键组件,它负责路由、负载均衡、安全验证等多种功能。Spring Cloud Gateway提供了强大的扩展能力,允许开发者通过自定义过滤器来增强其功能。本文将详细介绍如何实现一个自定义过滤器,用于记录响…

【分布式架构理论3】分布式调用(1):负载均衡

文章目录 零、三种不同的负载均衡一、常见行业负载均衡方案1. 电商与互联网服务2. 金融与支付系统3. 云计算与分布式存储 二、负载均衡策略概述1. 无状态负载均衡(强调公平性)2. 有状态的负载均衡(强调正确性) 三、 总结 零、三种…

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(九)-连号区间数、递增三元组

前言 在本篇博客中,我们将通过模拟方法解决两道经典的算法题:连号区间数和递增三元组。通过这两道题,我们将展示如何通过模拟操作和细致的算法设计来解决实际问题,帮助提升算法思维和编码能力。 连号区间数 小明这些天一直在思考…

Java面试题-Redis缓存

文章目录 1.**Redis 支持哪几种数据类型?**2.**Redis的持久化机制是怎样的?**1.RDB2.AOF3.对比 3.双写一致性1.问题2.双写不一致的原因3.延迟双删(有脏数据)4.读写锁(强一致)5.异步通知(最终一致…

C++基础知识学习记录—构造函数

1、构造函数(constructor) 作用:用于创建对象时给属性值进行初始化 构造函数是一个特殊的函数: 1、构造函数与类同名 2、如果没有显式给出构造函数,编译器会给出默认的构造函数(参数为空,并且函数体也为空),并没有…

Android studio怎么创建assets目录

在Android Studio中创建assets文件夹是一个简单的步骤,通常用于存储不需要编译的资源文件,如文本文件、图片、音频等 main文件夹,右键new->folder-assets folder