单例模式和工厂模式

设计模式

1.单例模式

定义:

单例模式要求某一类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。

使用场景:

1.需要频繁的进行创建和销毁的对象;
2.创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
3.工具类对象;
4.频繁访问数据库或文件的对象。

创建方式:

  // 饿汉式:
    public class Singleton{
    //创建私有构造方法
    	private Singleton(){};
    	//创建私有静态的成员变量并实例化
    	private final static Singleton instance = new Singleton();
    	//静态工厂实例
        public static Singleton getInstance(){
        	return instance;
        }
    }


   // 懒汉式:
    public class Singleton{
      //创建私有构造方法
    	private Singleton(){};
    	//创建私有静态的成员变量
    	private Singleton instance=null;
    	//静态工厂实例
        public static Singleton getInstance(){
        	if(instance == null){
        		instance = new Singleton;
        	}
        	return instance;
        }
    }

所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同。
饿汉式”是在不管你用的用不上,一开始就建立这个单例对象:比如:有个单例对象
“懒汉式”是在你真正用到的时候才去建这个单例对象:

但是他们都有各自的优缺点:
1.饿汉式:
饿汉式优点: 在多线程模式下是安全的
饿汉式缺点:提前创建好对象,如果在整个项目中没有使用,浪费内存资源。
2.懒汉式
懒汉式优点:只有调用方法才创建对象,不会占用内存
懒汉式缺点:线程不安全,在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。
单例模式和工厂模式_第1张图片
推荐用法:

public class Singleton{
	private Singleton(){};
    private static class SingleInstance{
        private final static Singleton ins = new Singleton();
    }
    public static Singleton getInstance(){
        return SingleInstance.ins;
    }
}

2.工厂模式

定义:

工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

代码实现:

核心类(抽象工厂)
public interface IFactory{
	ICar createCar();
}
汽车类
public interface ICar{
	void run();
}
public class baomaCar implements ICar{
	void run(){...}
}
public class aodiCar implements ICar{
	void run(){...}
}
实现具体工厂
public class baomaFactory implements IFactory{
	Icar createCar(){ return new baomaCar() }
}
public class aodiFactory implements IFactory{
	Icar createCar(){ return new aodiCar() }
}

你可能感兴趣的:(单例模式和工厂模式)