码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2020-10-31 02:04:50      阅读:19      评论:0      收藏:0      [点我收藏+]

标签:uml图   his   returns   void   username   ssd   验证   ==   form   

单例模式

  • 示例

    • 登录框
    • 购物车
  • 类图

    • 传统UML类图
    classDiagram class SingletonPatternDemo{ +main() void } class SingleObject{ -instance:SingleObject -SingleObject() +getInstance() SingleObject +showMessage() void } SingletonPatternDemo --> SingleObject :asks SingleObject --> SingleObject :returns

    说明

    • 单例模式需要用到java的特性(private)
    • ES6中没有(ts除外)
    • 只能用java代码来演示UML图的内容
    public class SingleObject{
        //注意,私有化构造函数,外部不能new,只能内部能new
        private SingleObject(){}
    
        //唯一被new出来的对象
        private SingleObject instance = null;
        //获取对象的唯一接口
        public SingleObject getInstance(){
            if(instance == null){
                //只new一次
                instance = new SingleObject();
            }
    
            return instance;
        }
    
        //对象方法
        public void login(username,password){
            System.out.println(‘login...‘);
        }
    }
    
    //测试
    public class SingleonPatternDemo{
        public static void main(String[] args){
            //获取唯一可用的对象
            SingleObject object = SingleObject.getInstance();
            object.login();
        }
    }
    
    • js中实现:无法完全控制
    class SingleObject{
        login(){
            console.log(‘login……‘);
        }
    }
    
    //静态方法
    SingleObject.getInstance = (function(){
        let instance;
        return function(){
            if(!instance){
                instance = new SingleObject();
            }
            return instance;
        }
    })();
    
    //测试:注意这里只能使用静态函数getInstance,不能new SingleObject()
    let obj1 = SingleObject.getInstance();
    obj1.login();
    let obj2 = SingleObject.getInstance();
    obj2.login();
    console.log(‘obj1 === obj2‘,obj1 === obj2);  //true
    
    console.log(‘------无法完全控制等情况------‘);
    let obj3 = new SingleObject();  //无法完全控制
    obj3.login();
    console.log(‘obj1 === obj3‘,obj1 === obj3); //false
    
  • 场景

    • jQuery只有一个$
    • 模拟登录框
    • 其他
      • 购物车(和登录框类似)
      • vuex和redux中的store

    示例:模拟登录框

    /**
     * 单例模式示例:模拟登录框
     */
    
    class LoginForm {
        constructor() {
            this.state = ‘hide‘;
        }
    
        show() {
            if (this.state === ‘show‘) {
                alert(‘已经显示‘);
                return;
            }
    
            this.state = ‘show‘;
            console.log(‘登录框已显示‘);
        }
    
        hide() {
            if (this.state === ‘hide‘) {
                alert(‘已经隐藏‘);
                return;
            }
    
            this.state = ‘hide‘;
            console.log(‘登录框已经隐藏‘);
        }
    }
    
    LoginForm.getInstance = (() => {
        let instance;
        return () => {
            if (!instance) {
                instance = new LoginForm();
            }
            return instance;
        }
    })();
    
    //测试
    let login1 = LoginForm.getInstance();
    login1.show();
    
    let login2 = LoginForm.getInstance();
    login2.show();
    
    console.log(‘login1 === login2‘,login1 === login2);  //true
    
  • 设计原则验证

    • 符合单一职责原则,只能实例化唯一的对象
    • 没法具体现开放封闭原则,但是绝对不违反开放封闭原则

单例模式

标签:uml图   his   returns   void   username   ssd   验证   ==   form   

原文地址:https://www.cnblogs.com/mrtransition/p/13902856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!