美文网首页
面试复习(五)程序设计模式篇

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

作者: 鹤书嗣音 | 来源:发表于2018-05-08 20:02 被阅读0次
  • 单例模式

    • 线程不安全

        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

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

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

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

相关文章

网友评论

      本文标题:面试复习(五)程序设计模式篇

      本文链接:https://www.haomeiwen.com/subject/jcnwrftx.html