一.单例模式
概念:保存在内存中只用一个实例
使用场景:系统配置文件的管理,这些配置文件只需要一个单例对象进行读写即可,获取配置文件信息,便于统一管理
优缺点
优:1.在内存中只有一个对象,节约空间
2.避免频繁的创建销毁对象,提高性能
3.避免对共享资源的多重占用,简化访问
4.为整个系统提供一个全局访问点
缺:
1.不适于变化频繁的对象
2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
饥饿模式
/**
* 单例模式,饥饿加载
*/
public class SingletonDemo {
//1. 需要有一个私有的构造函数,防止该类通过new的方式创建实例
private SingletonDemo(){}
//2. 饥饿模式,首先生成一个实例
private static final SingletonDemo instance = new SingletonDemo();
//3. 静态方法,用于获取已经生成的实例
public static SingletonDemo getInstance() {
return instance;
}
public String hello(String name) {
return "hello " + name;
}
//测试线程是否安全
public static void main(String[] args) {
for (int i = 0; i <100; i++) {
new Thread(()->{
System.err.println(danli.getInstance().hashCode());
}).start();
}
danli d=danli.getInstance();
System.err.println(d.hello("噔噔~~~~"));
}
}
这种直线方式简单,且是线程安全的。
懒汉模式
private lanhan() {
// TODO Auto-generated constructor stub
}
private static lanhan lanhan=null;
public static lanhan getInstance() {
if(lanhan==null) {
synchronized (lanhan.class) {
if(lanhan==null) {
lanhan=new lanhan();
}
}
}
return lanhan;
}
public String hello(String name) {
return "hello"+name;
}
//线程验证
public static void main(String[] args) {
for (int i = 0; i <100; i++) {
new Thread(()->{
System.err.println(lanhan.getInstance().hashCode());
}).start();
}
lanhan l=lanhan.getInstance();
System.err.println(l.hello("ss"));
}
}
枚举类
public enum lanhan2 {
INSTANCE;
public String hello(String name) {
return "hello"+name;
}
//线程验证
public static void main(String[] args) {
for (int i = 0; i <100; i++) {
new Thread(()->{
System.err.println(lanhan2.INSTANCE.hashCode());
}).start();
}
}
}
二.工厂模式
概念:用于产生对象的方法或者式类,称之为工厂。 上面所讲到的单例模式也可以看作为一个特殊的工厂。
使用场景
1.使用工厂的原因是我们可以通过工厂模式,来集中控制对象的创建过程,这样可以给设计带来更多的灵活性。
2.比如:spring的IOC容器就是工厂模式的经典实现。
抽象工厂
我们都比较熟悉的电脑制造相关行业,有HP,罗技,联想,戴尔,近几年华为,小米也进来了,每个生产商生产的电脑又包括鼠标,键盘,屏幕等等配件。此时我们需要使用工厂模式来进行管理不同的产品族,这时使用简单工厂(也有叫作工厂方法的)已经无法满足要求,此时可以使用抽象工厂。
工厂方法
工厂用于生产指定系列的对象。已鸭子为例,鸭子有真的鸭子,橡皮鸭,电子玩具鸭等。如何能方便的创建出各种鸭子,并将创建过程控制起来,以便于以后的维护和扩展