美文网首页
java(设计模式)

java(设计模式)

作者: luckee | 来源:发表于2019-01-26 15:29 被阅读0次

    前言

    设计模式-1
    设计模式-2

    5种创建型模式

    工厂方法模式

    要构建的对象,实现相同的接口

    • 普通工厂方法。只有一个工厂方法,根据传进来的参数的不同构建不同的对象
    • 多个方法工厂方法,方法没有参数,不同的方法构建不同的对象
    • 静态工厂方法,方法变为静态方法

    抽象工厂模式

    跟工厂方法模式相比,将工厂本身也抽象化了,有一个工厂接口provider,工厂都实现这个接口

    单例模式(singleton)

    JVM中只存在一个该类的对象,且只实例化一次,使用内部类来实现

    public class Singleton {
     
        /* 私有构造方法,防止被实例化 */
        private Singleton() {
        }
     
        /* 此处使用一个内部类来维护单例 */
        private static class SingletonFactory {
            private static Singleton instance = new Singleton();
        }
     
        /* 获取实例 */
        public static Singleton getInstance() {
            return SingletonFactory.instance;
        }
     
        /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
        public Object readResolve() {
            return getInstance();
        }
    }
    
    • 饿汉模式
    public class EagerSingleton {
        //饿汉单例模式
        //在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快
        
        private static EagerSingleton instance = new EagerSingleton();//静态私有成员,已初始化
        
        private EagerSingleton() 
        {
            //私有构造函数
        }
        
        public static EagerSingleton getInstance()    //静态,不用同步(类加载时已初始化,不会有多线程的问题)
        {
            return instance;
        }
        
    }
    
    • 懒汉模式
    public class LazySingleton {
        //懒汉式单例模式
        //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢
        
        
        private static LazySingleton intance = null;//静态私用成员,没有初始化
        
        private LazySingleton()
        {
            //私有构造函数
        }
        
        public static synchronized LazySingleton getInstance()    //静态,同步,公开访问点
        {
            if(intance == null)
            {
                intance = new LazySingleton();
            }
            return intance;
        }
    }
    

    构建者模式

    原型模式(prototype)

    以一个原对象为模板,返回原对象的复制(深拷贝和浅拷贝)

    public class Prototype implements Cloneable, Serializable {
     
        private static final long serialVersionUID = 1L;
        private String string;
     
        private SerializableObject obj;
     
        /* 浅复制 */
        public Object clone() throws CloneNotSupportedException {
            Prototype proto = (Prototype) super.clone();
            return proto;
        }
     
        /* 深复制 */
        public Object deepClone() throws IOException, ClassNotFoundException {
     
            /* 写入当前对象的二进制流 */
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
     
            /* 读出二进制流产生的新对象 */
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        }
     
        public String getString() {
            return string;
        }
     
        public void setString(String string) {
            this.string = string;
        }
     
        public SerializableObject getObj() {
            return obj;
        }
     
        public void setObj(SerializableObject obj) {
            this.obj = obj;
        }
     
    }
     
    class SerializableObject implements Serializable {
        private static final long serialVersionUID = 1L;
    }
    

    7种结构性模式

    image.png

    适配器模式

    • 类的适配器模式
      adapter继承一个类,实现一个接口


      image.png
    • 对象的适配器模式
      wrapper持有一个类的对象,实现一个接口,在重写接口的方法的时候,调用持有对象的方法


      image.png
    • 接口的适配器模式
      有时候需要使用一个接口的部分方法,但是实现接口需要实现其全部方法,因此可以先用一个抽象类实现接口的所有方法,然后继承抽象类,并重写需要使用的方法(java8后接口有允许有默认方法和静态方法,解决了这一问题)

    装饰器模式

    代理模式

    外观模式

    此三者目前分不太清,感觉都是代理模式

    桥接模式

    典型的例子是JDBC的实现,java提供统一的数据库接口,具体的实现由数据库厂商完成,厂商提供数据库驱动包

    组合模式

    典型的例子是树状结构

    享元模式

    典型的例子是连接池

    11种行为型模式

    image.png

    观察者模式

    其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系

    访问者模式

    相关文章

      网友评论

          本文标题:java(设计模式)

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