zoukankan      html  css  js  c++  java
  • 【图解设计模式五】Singleton 模式

    只有一个实例

    一、知识概述

    Singleton 模式是指,在任何情况下只生成一个实例,且该实例能够在程序上表现出来。该模式仅包含一种角色。

    • Singleton:负责实现返回唯一实例的方法。

    二、示例程序

    以下为实现了Singleton模式的示例程序,这段示例程序的作用是,从外部获取唯一实例,并进行验证。

    类图示例

    程序清单

    /**
     * 只存在一个实例的类
     */
    public class Singleton {
        private static Singleton singleton = new Singleton();
    
        private Singleton() {
            System.out.println("生成了一个实例");
        }
    
        public static Singleton getInstance() {
            return singleton;
        }
    }
    
    /**
     * 测试程序行为的类 验证任何情况下只生成一个实例
     */
    public class Main {
        public static void main(String[] args) {
            System.out.println("Start.");
            Singleton obj1 = Singleton.getInstance();
            Singleton obj2 = Singleton.getInstance();
            if (obj1 == obj2) {
                System.out.println("obj1与obj2是相同的实例");
            } else {
                System.out.println("obj1与obj2是不同的实例");
            }
            System.out.println("End.");
        }
    }
    
    

    三、课后习题

    习题1:

    修改以下代码,确保只能生成一个该类的实例

    public class TicketMaker {
        private int ticket = 1000;
        public int getNextTicketNumber() {
            return ticket++;
        }
    }
    

    回答1:

    public class TicketMaker {
        
        private static TicketMaker maker = new TicketMaker();
            
        public static getInstance() {
            return maker;
        }
        
        private int ticket = 1000;
        
        private TicketNumber() {
        }
        
        public synchronized int getNextTicketNumber() {
            return ticket++;
        }
    }
    

    习题2:

    编写Triple类,实现最多只能生成3个Triple类的实例,实例编号1,2,3,且可以通过getInstance(int id) 来获取该编号对应的实例

    回答2:

    public class Triple {
        private static Triple[] triples = new Triple[] {
                new Triple(0),
                new Triple(1),
                new Triple(2),
        };
        
        public static Triple getInstance(int id) {
            return triples[id];
        }
        // 限制可见性
        private Triple() {
        }
    }
    

    习题3:

    某研发人员编写了如下的Singleton类,但这并非严格的Singleton模式。why?

    public class Singleton {
        // 限制可见性
        private Singeton() {
            System.out.println("生成了一个实例");
        }
        
        private static Singleton singleton = null;
        
        public static Singleton getInstance() {
            if (singleton == null) {
                singleton = new Singleton();
            }
            return singleton;
        } 
    }
    

    回答3:

    这是因为在多个线程在同时调用getInstance方法时,可能会生成多个实例。
    
  • 相关阅读:
    RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库
    Pop–实现任意iOS对象的任意属性的动态变化
    界面传值失败
    UIImagePickerController
    NSURLSession
    iOS图标尺寸
    cocoapods
    duplicate symbol _OBJC_IVAR
    MAC升级openssl
    Mac
  • 原文地址:https://www.cnblogs.com/zzzz76/p/14425733.html
Copyright © 2011-2022 走看看