单例模式 2(单实例类)
一. 前言
在前上一章教程中, 介绍了静态方法的伪单例模式.
本章将在上一章的基础上, 进一步扩展程序.
注:
1. 本文针对初学 Java 的同学训练学习思路, 请不要太纠结于细节问题.
2. 本文旨在达到抛砖引玉的效果, 希望大家扩展本例子, 以学到更多知识的精髓.
学习本章需要准备的知识:
1. 读完本系列教程的前面章节.
2. 理解单例模式.
二. 步入正题
话不多说, 大家自己理解, 下面步入正题:
静态方法虽然能满足我们的需求, 但他牺牲了面向对象对程序带来的扩展性, 比如 AOP 等.
本章我们讨论对单实例类的处理.
首先我们要保证对该类的创建只能通过一个入口来进行, 即不能通过 new 方式来创建类, 否则无法控制实例的数量.
我们把构造函数私有化, 这样, 在该类以外就不能用 new 方式来创建实例.
然后做一个 getInstance 的静态方法来作为创建实例的入口, 即通过类名. getInstance 来生成实例.
然后做一个静态类变量, 在类第一次被加载的时候就生成唯一的实例, 以后每次调用 getInstance 就返回该实例.
代码如下:
- /**
- *
- * @author http://www.java123.vip
- *
- */
- public class PersonDao {
- private static PersonDao instance = new PersonDao();
- private PersonDao() {}
- public static PersonDao getInstance() {
- return instance;
- }
- public void savePerson(Person person) {
...... 略
- }
- public Person getPersonById(String id) {
...... 略
- }
- }
- /**
- *
- * @author http://www.java123.vip
- *
- */
- public class PersonService {
- private static PersonService instance = new PersonService();
- private PersonService() {}
- public static PersonService getInstance() {
- return instance;
- }
- public Person getPerson(String personid) {
- PersonDao personDao = PersonDao.getInstance();
- Person person = personDao.getPersonById(personid);
- return person;
- }
- }
三. 测试
测试代码如下:
- /**
- *
- * @author http://www.java123.vip
- *
- */
- public class PersonServiceTest {
- public static void main(String[] args) {
- PersonService personService = PersonService.getInstance();
- Person personResult = personService.getPerson("1");
- System.out.println("id:"+personResult.id);
- System.out.println("username:"+personResult.username);
- System.out.println("password:"+personResult.passwd);
- }
- }
程序输出如下:
- id:1
- username:abc
- password:aaa
完整程序请大家从 [这里 https://www.java123.vip/javabase.php ] 下载
来源: http://www.bubuko.com/infodetail-2809976.html