栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式之二----创建模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式之二----创建模式

设计模式之二----创建模式 创建模式

这类模式提供创建对象的机制,能够提升已有代码的灵活性和可复用性。

简介如下图所示:

  • 工厂方法模式


工厂模式又称工厂方法模式,是一种创建型设计模式,在其父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。它的主要意图是定义⼀一个创建对象的接⼝口,让其⼦子类⾃自⼰己决定实例例化哪⼀一个⼯工⼚厂类,⼯工⼚厂模式使其创建过程延迟到⼦子类进⾏行行。

简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑,让外部可以更简单的只知道调用即可。即如上图中,外部只需选择陆上运输或者海上运输即可,而无需知道具体是哪一辆车或者哪一艘船运输的。

  • 抽象工厂模式


抽象工厂模式的主要意图也是为了解决接口选择问题,但在实际上,抽象工厂是一个中心工厂,创建其他工厂的模式。

在JDBC中,Driver利用的是工厂方法模式,其工厂类是DriverManager;Connection利用的是抽象工厂模式,它就是那个抽象工厂。

  • 建造者模式


建造者模式所完成的内容就是将多个简单对象通过一步步的组装构建出一个复杂对象的过程。而在此过程中,将这些个简单对象通过不同的组装便可以产生不同的具体内容。也即将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

  • 原型模式


原型模式主要解决创建重复对象。这部分对象往往内容复杂,生成过程可能从库或者RPC接口中获取数据的耗时较长,因此采用克隆的方式节省时间。可以理解为:一个对象的产生可以不由零起步,直接从一个已经具备一定雏形的对象克隆,然后再修改为生产需要的对象。原型模式本质是一种克隆对象的方法,其核心是重写Object中的clone方法,调用该方法可以在内存中进行对象拷贝。Java提供了一个标记接口——Cloneable,实现该接口完成标记,在JVM中具有这个标记的对象才有可能被拷贝。如果不实现该接口,克隆对象会抛出CloneNotSupportedException 异常。

  • 单例模式


单例模式大家都耳熟能详了,即一个类只创建一个实例对象。

8种单例模式实现:
  1. 静态类使用

    public class Singleton{
        public static Map cache = new ConcurrentHashMap();
    }
    

    静态类的方式可以在第一次运行的时候直接初始化Map类。

  2. 懒汉模式(线程不安全)

    public class Singleton{
    	private static Singleton instance;
    	private Singleton(){}
    	public static Singleton getInstance(){
    		if(null != instance) return instance;
    		instance = new Singleton();
    		return instance;
    	}
    }
    

    单例例模式有一个特点就是不允许外部直接创建,也就是不允许外部new Singleton() 。
    目前此种方式的单例确实满足了懒加载,但是如果有多个访问者同时去获取对象实例,就会造成多个同样的实例并存,从而没有达到单例的要求。

  3. 懒汉模式(线程安全)

    public class Singleton{
    	private static Singleton instance;
    	private Singleton(){}
    	public static synchronized Singleton getInstance(){
    		if(null != instance) return instance;
    		instance = new Singleton();
    		return instance;
    	}
    }
    

    此种方法虽然是线程安全的,但由于把锁加到方法上后,所有的访问都因需要锁的占用而导致系统资源的浪费。

  4. 饿汉模式(线程安全)

    public class Singleton{
    	private static Singleton instance = new Singleton();
    	private Singleton(){}
    	public static Singleton getInstance(){
    		return instance;
    	}
    }
    

    此种方式在程序启动时直接运行加载,后续有外部需要使用的时候获取即可。易导致在程序启动时占用资源过多。

  5. 类的内部类(线程安全)

    public class Singleton{
    	private static class SingletonHolder{
    		private static Singleton instance = new Singleton();
    	}
    	private Singleton(){}
    	public static Singleton getInstance(){
    		return SingletonHolder.instance;
    	} 
    }
    

    使用类的内部类实现的单例模式,既保证了线程安全,又保证了懒加载,同时不会因为加锁的方式导致资源占用。这主要是因为JVM可以保证多线程并发访问的正确性,也就是一个类的构造方法在多线程环境下可以被正确的加载。

  6. 双重锁校验(线程安全)

    public class Singleton{
    	private static Singleton instance;
    	private Singleton(){}
    	public static Singleton getInstance(){
    		if(null != instance) return instance;
    		synchronized(Singleton.class){
    			if(null == instance){
    				instance = new Singleton();
    			}
    		}
    		return instance;
    	}
    }
    

    双重锁的方式式方法锁的优化,减少了部分获取实例的耗时。

  7. 使用volatile修饰的双重锁校验(线程安全)

    public class Singleton{
    	private static volatile Singleton instance;
    	private Singleton(){}
    	public static Singleton getInstance(){
    		if(null == instance){
    			synchronized(Singleton.class){
    				if(null == instance){
    					instance = new Singleton();
    				}
    			}
    		}
    		return instance;
    	}
    }
    

    volatile可以实现内存的可见性和防止指令重排序。使用volatile 修饰保证 singleton 的实例化能够对所有线程立即可见。(具体内容请参考单例模式&&volatile)

  8. 枚举单例(线程安全)

    public enum Singleton{
    	INSTANCE;
    	public static Singleton getInstance(){
    		return INSTANCE;
    	}
    }
    

    《Effective Java》作者推荐使用枚举的方式解决单例模式。这种方式解决了最主要的:线程安全、自由串行化、单一实例。

参考:
重学Java设计模式.pdf(提取码: m6gr)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/885346.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号