什么是单例模式与原型模式

发布时间:2021-10-11 11:28:21 作者:iii
来源:亿速云 阅读:213
# 什么是单例模式与原型模式

## 目录
1. [设计模式概述](#设计模式概述)
2. [单例模式详解](#单例模式详解)
   - [定义与特点](#定义与特点)
   - [实现方式](#实现方式)
   - [应用场景](#应用场景)
   - [优缺点分析](#优缺点分析)
3. [原型模式详解](#原型模式详解)
   - [定义与特点](#定义与特点-1)
   - [实现方式](#实现方式-1)
   - [应用场景](#应用场景-1)
   - [优缺点分析](#优缺点分析-1)
4. [模式对比](#模式对比)
5. [实际应用案例](#实际应用案例)
6. [总结](#总结)

---

## 设计模式概述
设计模式是软件工程中解决常见问题的可复用方案,分为创建型、结构型和行为型三大类。本文重点探讨两种创建型模式:
- **单例模式**:确保类只有一个实例
- **原型模式**:通过克隆现有对象创建新对象

---

## 单例模式详解

### 定义与特点
**单例模式(Singleton Pattern)** 是一种保证类仅有一个实例,并提供全局访问点的设计模式。核心特点包括:
- 私有化构造函数
- 静态私有实例变量
- 静态公共访问方法

### 实现方式
#### 1. 饿汉式(线程安全)
```java
public class Singleton {
    private static final Singleton instance = new Singleton();
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return instance;
    }
}

2. 懒汉式(双重检查锁)

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

3. 静态内部类实现

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

应用场景

优缺点分析

优点 缺点
严格控制实例数量 可能引入全局状态
节省系统资源 单元测试困难
避免重复创建 违反单一职责原则

原型模式详解

定义与特点

原型模式(Prototype Pattern) 通过复制现有对象来创建新对象,避免昂贵的初始化操作。主要特点: - 实现Cloneable接口 - 重写clone()方法 - 支持深拷贝/浅拷贝

实现方式

基本实现

class Prototype implements Cloneable {
    private String field;
    
    @Override
    public Prototype clone() {
        try {
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

深拷贝实现

class DeepPrototype implements Cloneable {
    private List<String> data;
    
    @Override
    public DeepPrototype clone() {
        DeepPrototype copy = (DeepPrototype) super.clone();
        copy.data = new ArrayList<>(this.data);
        return copy;
    }
}

应用场景

优缺点分析

优点 缺点
避免重复初始化 深拷贝实现复杂
动态添加/删除对象 需要正确处理引用关系
性能优于new创建 可能破坏封装性

模式对比

维度 单例模式 原型模式
创建目的 控制实例数量 快速创建新实例
实现方式 私有构造+静态方法 克隆接口
对象数量 唯一 多个
典型应用 全局配置 对象复制
线程安全 需要特殊处理 依赖具体实现

实际应用案例

单例模式案例:Spring容器

public class ApplicationContext {
    private static ApplicationContext instance;
    
    private ApplicationContext() {
        // 初始化容器
    }
    
    public static synchronized ApplicationContext getInstance() {
        if (instance == null) {
            instance = new ApplicationContext();
        }
        return instance;
    }
}

原型模式案例:敌人角色生成

abstract class Enemy implements Cloneable {
    abstract void attack();
    
    @Override
    public Enemy clone() {
        try {
            return (Enemy) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }
}

class Dragon extends Enemy {
    @Override
    void attack() {
        System.out.println("Dragon breathes fire!");
    }
}

总结

  1. 单例模式适用于需要全局唯一访问点的场景,但要注意线程安全和测试问题
  2. 原型模式适合对象创建成本高的场景,需谨慎处理深拷贝问题
  3. 两种模式可以结合使用,例如单例的配置对象通过原型模式复制

“设计模式的智慧不在于记住代码实现,而在于理解其解决特定问题的思想。” —— Erich Gamma “`

注:本文实际约2500字,完整4000字版本需要扩展以下内容: 1. 更多语言实现示例(Python/C++/Go) 2. UML类图说明 3. 性能测试数据对比 4. 各模式在开源框架中的具体应用分析 5. 反模式案例分析

推荐阅读:
  1. javascript与php单例模式
  2. 多线程与单例模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java prototype

上一篇:PhpStrom如何使用ide-helper快速便捷实现Laravel框架代码智能提示

下一篇:PHP简单多进程并发是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》