《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类通过一个静态方法返回一个静态对象。

相关文章
|
3天前
|
开发工具 Android开发 git
Windows下载android2.2完整源码(转)
Windows下载android2.2完整源码(转)
15 3
|
12天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
3天前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
12 4
|
5天前
|
Java Android开发
Android12 双击power键启动相机源码解析
Android12 双击power键启动相机源码解析
14 0
|
3天前
|
Android开发
在android源码中编译ADW_Launcher
在android源码中编译ADW_Launcher
10 2
|
5天前
|
Android开发
Android 高通平台集成无源码apk示例
Android 高通平台集成无源码apk示例
15 0
|
5天前
|
Android开发
Android修改源码实现root
Android修改源码实现root
8 0
|
6天前
|
Java Android开发
Android 设置系统时区的源码追踪
Android 设置系统时区的源码追踪
11 1
|
13天前
|
设计模式 算法 搜索推荐
【PHP开发专栏】PHP设计模式解析与实践
【4月更文挑战第29天】本文介绍了设计模式在PHP开发中的应用,包括创建型(如单例、工厂模式)、结构型和行为型模式(如观察者、策略模式)。通过示例展示了如何在PHP中实现这些模式,强调了它们在提升代码可维护性和可扩展性方面的作用。设计模式是解决常见问题的最佳实践,但在使用时需避免过度设计,根据实际需求选择合适的设计模式。
|
13天前
|
人工智能 算法 Java
程序设计的艺术:深入解析与实战演练
程序设计的艺术:深入解析与实战演练
25 4

推荐镜像

更多