zoukankan      html  css  js  c++  java
  • java面试07——设计模式

    1.什么是设计模式

    设计模式就是经过前人无数次的实践总结出的,设计过程可以反复使用的,可以解决特定问题的设计方法。

    2.常用的设计模式有哪些

    2.1单例模式(饱汉模式、饿汉模式、双重锁模式)

    https://blog.csdn.net/zhangliangzi/article/details/52438401

    1.构造方法私有化,让除了自己类中能创建外,其他地方不能创建;

    2.在自己类中创建一个单实例(饱汉模式是一出来就创建单实例,而饿汉模式需要的时候才创建);

    3.提供一个方法获取该实例对象(饿汉模式创建时需要进行方法同步)。

    //饿汉模式,很饿很着急,所以类加载时即创建实例对象
    public class Singleton1 {
        
        private static Singleton1 singleton = new Singleton1();
        
        private Singleton1(){
            
        }
        
        public static Singleton1 getInstance(){
            return singleton;
        }
    }
    //饱汉模式,很饱不着急,延迟加载,啥时候用啥时候创建实例,存在线程安全问题
    public class Singleton2 {
     
        private static Singleton2 singleton;
        
        private Singleton2(){
            
        }
        
        public static synchronized Singleton2 getInstance(){
            if(singleton == null) 
                singleton = new Singleton2();
            return singleton;
        }
    }
    //饱汉模式的双重锁模式,提高效率
    public class Singleton3 {
        private static Singleton3 singleton;
        
        private Singleton3(){
            
        }
        
        public static Singleton3 getInstance(){
            if(singleton == null){
                synchronized(Singleton3.class){
                    if(singleton == null){
                        singleton = new Singleton3();
                    }
                }
            }
            return singleton;
        }
    }

    1、饿汉模式是线程安全的,因为实例对象在类加载过程中就会被创建,在getInstance()方法中只是直接返回对象引用。之所以被称为“饿汉”,是因为这种模式创建实例对象比较“急”,真的是饿坏了……

    好处:简单明了,无需关注线程安全问题。

    缺点:如果在一个大环境下使用了过多的饿汉单例,则会生产出过多的实例对象,无论你是否要使用他们。

    2、饱汉模式不是线程安全的,因为是在需要的时候才会产生实例对象,生产之前会判断对象引用是否为空,这里,如果多个线程同时进入判断,就会生成多个实例对象,这是不符合单例的思想的。所以饱汉模式为了保证线程安全,就用synchronized关键字标识了方法。之所以被称为“饱汉”,因为它很饱,不急着生产实例,在需要的时候才会生产。

    好处:延时加载,用的时候才会生产对象。

    缺点:需要保证同步,付出效率的代价。

    3、双重锁模式,是饱汉模式的优化,进行双重判断,当已经创建过实例对象后就无需加锁,提高效率。也是一种推荐使用的方式。

    2.2工厂模式

    Spring IOC就是使用的工厂模式

    对象的创建交给一个工厂去创建,自己不用创建

    https://www.cnblogs.com/xinmomoyan/p/11996590.html

    2.3代理模式

    Spring AOP就是使用的代理模式

    https://www.cnblogs.com/xinmomoyan/p/12109712.html

    动态代理回顾

    2.4包装模式

  • 相关阅读:
    URAL 1998 The old Padawan 二分
    URAL 1997 Those are not the droids you're looking for 二分图最大匹配
    URAL 1995 Illegal spices 贪心构造
    URAL 1993 This cheeseburger you don't need 模拟题
    URAL 1992 CVS
    URAL 1991 The battle near the swamp 水题
    Codeforces Beta Round #92 (Div. 1 Only) A. Prime Permutation 暴力
    Codeforces Beta Round #7 D. Palindrome Degree hash
    Codeforces Beta Round #7 C. Line Exgcd
    Codeforces Beta Round #7 B. Memory Manager 模拟题
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/11516211.html
Copyright © 2011-2022 走看看