面试复习(五)程序设计模式篇

  • 单例模式

    • 线程不安全

        public class Sinfleton{
            private static Singleton instance;
            private Singleton(){}
            
            public static Singleton getInstance(){
                if(instance == null){
                    instance = new Singleton();
                }
                return instance;
            }
        }
      
    • 线程安全

      • getInstance()用synchroniz进行修饰。

        • 由于getInstance ()方法使用率低,对程序性能不关键;
        • 加锁影响效率
      • 引进Singleton类时即构建其单例

        • 不用加锁效率较高

        • 易产生垃圾对象

        • 加载时初始化浪费内存

            public class Singleton{
                private static Singleton instance = new Singleton();
                private Singleton(){}
                
                public static Singleton getInstance(){
                    return instance;
                }
            }           
          
      • 双重校验锁(DCL double-checked locking),只在创建单例时加锁

        • 双锁机制在多线程下保持高性能

            public class Singleton{
                private Singleton instance;
                private Singleton()}{}
                
                public static Singleton getInstance(){
                    if (instance == null){
                        synchronized(Singleton.class){
                            if(istance == null){
                                instance = new Singleton();
                            }
                        }
                    }
                    return instance;
                }
            }
          
      • 采用holder保证初始化时只有一个线程

          public class Singleton {  
              private static class SingletonHolder {  
              private static final Singleton INSTANCE = new Singleton();  
              }  
              private Singleton (){}  
              public static final Singleton getInstance() {  
              return SingletonHolder.INSTANCE;  
              }  
          }   
        
  • 工厂模式:定义接口,使产品类全部继承该接口并重写关键函数,然后根据不同条件创建不同实例,返回对应父类类型的产品

    • 优点:调用者只需知道产品名称就可以创建对应的对象、拓展新高、忽略产品具体实现,只需要关心产品的接口

    • 缺点:对每种产品都需要添加相应的产品类和对象实现工厂,增加了系统复杂度与具体类的依赖

    • 适用于需要生成复杂对象的地方,对于简单对象,直接new即可,不需要引入工厂类增加系统复杂度

        //接口
        public interface Shape{
            void draw();
        }
        
        //实体类
        public class Circle implements Shape{
            @Override
                public void draw(){
                    sout("draw circle");
            }
        }
        
        public class Square implements Shape{
            @Override
                public void draw(){
                    sout("draw square");
            }
        }
      
        //工厂
        public class Shapefactory{
            public Shape getShape(String type){
                if(type == null){
                    return null;
                }
                if(type.equals("Circle")){return new Circle;}
                else if(type.equals("Square")){return new Square;}
                return null;
            }
        }
        
        //使用工厂
        public class FactoryDemo{
            public static void main(String[] args){
                ShapeFactory sf = new ShapeFactory();
                
                Shape shape1 = sf.getShape("Circle");
                Shape shape2 = sf.getShpae("Square");
            }
        }
      
  • 建造者模式:多个简单对象构成复杂对象,如StringBuilder

    • 优点:创建者独立,易拓展,便于控制细节风险
    • 缺点:产品范围有限制,必须有共同点、生成对象内部属性相互依赖
  • 适配器模式

  • 观察者模式:对象间一对多关系时,若一个对象状态发生改变,则所有依赖其的对象都被通知并更新

    • 优点:观察者与被观察者关系是抽象耦合的,触发机制
    • 缺点:一对很多观察者时,通知所有观察者会花费很多时间、循环依赖可能导致系统崩溃、观察者只能知道被观察者发生变化而不知道如何变化
  • 桥接模式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,484评论 1 8
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,344评论 0 6
  • Part1.效果展示 效果展示 图展示了『前后左右上下+头部随动』即六自由度的VR效果。 工程源码:https:/...
    二月的大胡子阅读 6,559评论 1 23