《Android 源码设计模式解析与实战》——第2章,第2.5节单例模式的简单示例

简介:

本节书摘来自异步社区《Android 源码设计模式解析与实战》一书中的第2章,第2.5节单例模式的简单示例,作者 何红辉 , 关爱民,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.5 单例模式的简单示例
单例模式是设计模式中比较简单的,只有一个单例类,没有其他的层次结构与抽象。该模式需要确保该类只能生成一个对象,通常是该类需要消耗较多的资源或者没有多个实例的情况。例如,一个公司只有一个CEO、一个应用只有一个Application对象等。下面以公司里的CEO为例来简单演示一下,一个公司可以有几个VP、无数个员工,但是CEO只有一个,请看下面示例。

示例实现代码
package com.dp.example.singleton;
// 普通员工
public class Staff { 
  public void work() {
    // 干活
  }
}

// 副总裁
public class VP extends Staff {
  @Override
  public void work() {
    // 管理下面的经理
  }
}

// CEO,饿汉单例模式
public class CEO extends Staff {
  private static final CEO mCeo = new CEO();
  // 构造函数私有
  private CEO() {
  }

  // 公有的静态函数,对外暴露获取单例对象的接口
  public static CEO getCeo() {
    return mCeo;
  }

  @Override
  public void work() {
    // 管理VP
  }
}

// 公司类
public class Company {
  private List<Staff> allStaffs = new ArrayList<Staff>();
  public void addStaff(Staff per) {
    allStaffs.add(per);
  }

  public void showAllStaffs() {
    for (Staff per : allStaffs) {
      System.out.println("Obj : " + per.toString());
    }
  }
}

public class Test {
  public static void main(String[] args) {
    Company cp = new Company() ;
    // CEO对象只能通过getCeo函数获取
    Staff ceo1 = CEO.getCeo() ;
    Staff ceo2 = CEO.getCeo() ;
    cp.addStaff(ceo1);
    cp.addStaff(ceo2);
    // 通过new创建VP对象
    Staff vp1 = new VP() ;
    Staff vp2 = new VP() ;
    // 通过new创建Staff对象
    Staff staff1 = new Staff() ;
    Staff staff2 = new Staff() ;
    Staff staff3 = new Staff() ;

    cp.addStaff(vp1);
    cp.addStaff(vp2);
    cp.addStaff(staff1);
    cp.addStaff(staff2);
    cp.addStaff(staff3);

    cp.showAllStaffs();
  }
}  

输出结果如下:

Obj : com.android.dp.book.chapter2.company.CEO@5e8fce95
Obj : com.android.dp.book.chapter2.company.CEO@5e8fce95
Obj : com.android.dp.book.chapter2.company.VP@8b3
Obj : com.android.dp.book.chapter2.company.VP@222d10
Obj : com.android.dp.book.chapter2.company.Staff@1aa488
Obj : com.android.dp.book.chapter2.company.Staff@3dfeca64
Obj : com.android.dp.book.chapter2.company.Staff@22998b08

从上述的代码中可以看到,CEO类不能通过new的形式构造对象,只能通过CEO.getCEO()函数来获取,而这个CEO对象是静态对象,并且在声明的时候就已经初始化,这就保证了CEO对象的唯一性。从输出结果中发现,CEO两次输出的CEO对象都是一样的,而VP、Staff等类型的对象都是不同的。这个实现的核心在于将CEO类的构造方法私有化,使得外部程序不能通过构造函数来构造CEO对象,而CEO类通过一个静态方法返回一个静态对象。

相关文章
|
17天前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
49 1
|
25天前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
59 0
|
1月前
|
设计模式 缓存 安全
【设计模式】单例模式:确保类只有一个实例
【设计模式】单例模式:确保类只有一个实例
20 0
|
3月前
|
设计模式 安全 Java
设计模式-单例模式
设计模式-单例模式
36 0
|
1月前
|
设计模式 安全 Java
设计模式之单例模式
设计模式之单例模式
|
1月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
5天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
12 1
|
25天前
|
设计模式 缓存 Java
单例模式解析:从理论到代码实践
单例模式解析:从理论到代码实践
11 0
|
26天前
|
缓存 移动开发 Java
构建高效Android应用:内存优化实战指南
在移动开发领域,性能优化是提升用户体验的关键因素之一。特别是对于Android应用而言,由于设备和版本的多样性,内存管理成为开发者面临的一大挑战。本文将深入探讨Android内存优化的策略和技术,包括内存泄漏的诊断与解决、合理的数据结构选择、以及有效的资源释放机制。通过实际案例分析,我们旨在为开发者提供一套实用的内存优化工具和方法,以构建更加流畅和高效的Android应用。
|
1月前
|
设计模式 存储 缓存
设计模式之单例模式(C++)
设计模式之单例模式(C++)
21 2

推荐镜像

更多