zoukankan      html  css  js  c++  java
  • 案例分析:设计模式与代码的结构特性

    一、单例设计模式

      单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。

      单例模式有 3 个特点:

    • 单例类只有一个实例对象;
    • 该单例对象必须由单例类自行创建;
    • 单例类对外提供一个访问该单例的全局访问点;

      单例模式的应用场景:

    • 在应用场景中,某类只要求生成一个对象的时候,如一个班中的班长、每个人的身份证号等。
    • 当对象需要被共享的场合。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度。如 Web 中的配置对象、数据库的连接池等。
    • 当某类需要频繁实例化,而创建的对象又频繁被销毁的时候,如多线程的线程池、网络连接池等。

    二、单例模式的结构

      通常,普通类的构造函数是公有的,外部类可以通过“new 构造函数()”来生成多个实例。但是,如果将类的构造函数设为私有的,外部类就无法调用该构造函数,也就无法生成多个实例。这时该类自身必须定义一个静态私有实例,并向外提供一个静态的公有函数用于创建或获取该静态私有实例。其结构如下图:

     

    三、单例模式的应用实例

      问题:用懒汉式单例模式模拟产生美国当今总统对象。

      分析:在每一届任期内,美国的总统只有一人,所以本实例适合用单例模式实现,下图所示是用懒汉式单例实现的结构图。

     

      类代码如下:

     1 public class SingletonLazy
     2 {
     3     public static void main(String[] args)
     4     {
     5         President zt1=President.getInstance();
     6         zt1.getName();    //输出总统的名字
     7         President zt2=President.getInstance();
     8         zt2.getName();    //输出总统的名字
     9         if(zt1==zt2)
    10         {
    11            System.out.println("他们是同一人!");
    12         }
    13         else
    14         {
    15            System.out.println("他们不是同一人!");
    16         }
    17     }
    18 }
    19 class President
    20 {
    21     private static volatile President instance=null;    //保证instance在所有线程中同步
    22     //private避免类在外部被实例化
    23     private President()
    24     {
    25         System.out.println("产生一个总统!");
    26     }
    27     public static synchronized President getInstance()
    28     {
    29         //在getInstance方法上加同步
    30         if(instance==null)
    31         {
    32                instance=new President();
    33         }
    34         else
    35         {
    36            System.out.println("已经有一个总统,不能产生新总统!");
    37         }
    38         return instance;
    39     }
    40     public void getName()
    41     {
    42         System.out.println("我是美国总统:特朗普。");
    43     }  
    44 }

      在这个例子中,President类中定义了一个静态President对象,保证该对象属性的全局唯一性,主程序中实例化了zt1和zt2对象,但两个对象内存区只存在一份President的拷贝,实现了单例模式的设计方法。

  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/wzzgeorge/p/12005027.html
Copyright © 2011-2022 走看看