设计模式学习笔记1

学习设计模式的意义

设计模式的本质是面向对象原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系、组合关系的充分理解
正确使用设计模式具有以下优点
可以提高程序员的编程能力、思维能力和设计能力
使程序设计更加标准化,代码编制更加工程化,使软件开发效率大大提高,从而缩短软件开发周期
使设计的代码可重用性高,可读性强,可靠性高,灵活性好,可维护性强

oop七大原则

开闭原则:对扩展开放,对修改关闭
里氏替换原则:继承必须确保超类拥有的性质在子类中仍然成立,
依赖倒置原则:要面向接口编程,而不要面向实现编程
单一职责原则:控制类的粒度大小,将对象解耦,提高其内聚性
接口隔离原则:要为各个类创建他们需要的专用接口
迪米特法则:只与你的直接朋友交流,不要和陌生人说话
合成复用原则:尽量使用组合或聚合等关联关系来实现,其次才考虑使用继承关系来实现

单例模式

饿汉式单例模式

//饿汉式单例模式
public class Hungry {
    private Hungry(){
    }
    private final static Hungry hungry=new Hungry();
    public static Hungry getInstance(){
        return hungry;
    }
    public static void main(String args[])
    {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                System.out.println(Hungry.getInstance().hashCode());
            }).start();
        }
    }
}

懒汉式单例模式

public class LazyMan {
    private LazyMan(){
        if(lazyMan!=null){
            synchronized(LazyMan.class){
                if(lazyMan!=null)
                {
                    System.out.println("不要试图使用反射破环异常");
                }
            }
        }
    }
    private volatile static LazyMan lazyMan;
    //双重检测锁机制的懒汉式单例 DCL懒汉式
    public static LazyMan getInstance()
    {
        if(lazyMan==null)
        {
            synchronized (LazyMan.class){
                if(lazyMan==null) {
                    lazyMan = new LazyMan();
                }
            }
        }
        return lazyMan;
    }
    public static void main(String args[])
    {
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                LazyMan.getInstance();
            }).start();
        }
    }
}

静态内部类

//静态内部类单例模式
public class Holder {
    private Holder(){}
    public static Holder getInstance(){
        return innerClass.holder;
    }
    public static class innerClass{
        private static final  Holder holder=new Holder();
    }

}

枚举类型单例模式

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

//使用枚举类型创建单例模式,避免被反射破环
public enum Enum {
    INSTANCE;
    public Enum getInstance()
    {
        return INSTANCE;
    }

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Enum en=Enum.INSTANCE;
        Constructor<Enum> declare=Enum.class.getDeclaredConstructor(String.class,int.class);
        declare.setAccessible(true);
        Enum en2=declare.newInstance();
        System.out.println(en.hashCode());
        System.out.println(en2);

    }
}

你可能感兴趣的:(笔记)