设计模式(单例工厂)
Posted offerNotFound
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式(单例工厂)相关的知识,希望对你有一定的参考价值。
设计模式的六大原则
- 单一原则:一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化。
- 里氏替换原则:子类可以扩展父类的功能,但不能改变原有父类的功能。
- 依赖倒置原则:面向接口编程(通过接口作为参数实现应用场景),抽象就是接口或者抽象类,细节就是实现类。
- 接口隔离:建立单一接口(复杂的接口,根据业务拆分成多个简单接口)。
- 迪米特原则:最少知道原则,尽量降低类与类之间的耦合(一个对象应该对其他对象有最少的了解)。
- 开闭原则:用抽象构建架构,用实现扩展原则。
单例模式
单例模式就是在整个运行时一个类只能构建一个实例对象。那为什么需要单例模式呢?因为有些类的实例的创建和销毁对资源来说消耗不大(比如 String 类),并且很多实例是可以复用的(比如数据库的连接对象)。
Java如何去实现单例模式
单例模式的写法需要考虑三点:
- 是不是懒加载(即要用到这个实例才去创建,而不是一来就创建好了的,因为有的对象创建的花销很大,万一创建了一次都没有被用到就很亏)
- 是否线程安全
- 能否通过反射来破坏(一般来说不用考虑它)
一、这是第一种写法,最普通的,只满足了懒加载的要求(不建议直接在方法上直接加synchronized
;来保证线程安全,性能太差了)。
public class Single
private Single(); 构造器私有,无法new出来
private Single instance = null; 初始化对象为空
public Single getInstance()
if(instance == null)
instance = new Single();
return instance;
二、双检锁写法(推荐使用),这种写法保证了懒加载与线程安全,并且加了volatile
关键字来确保创建对象时不会指令重排序。
public class Single
private volatile Single instance;
public Single()
public Single getInstance()
if(instance == null)
synchronized (Single.class)
if(instance == null)
instance = new Single();
return instance;
三、枚举写法,这种方法保证了不会被反射破坏与线程安全,但是无法满足懒加载。
public enum Single
INSTANCE;
所以,目前是没有一种写法可以满足三个条件,因为反射破坏这个就不咋考虑了(毕竟反射破坏大多是人为的)。还有一些写法就没记录了,像内部类写法等…
工厂模式
工厂模式就是定义一个用于创建对象的接口,让子类决定实例化哪些类,然后工厂方法使一个类的实例化延迟到其子类。其中又分为:简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式
创建一个对象可能是极其复杂的,比如你得给它赋值很多属性一堆东西,但是用户要的东西却很单一(就比如一个汽车工厂,它可以生产宝马或者奔驰,并且生产的过程很繁琐,但是用户买车就直接告诉你要宝马,你直接给用户一辆宝马就行了)。所以当用户想要得到一个对象时,直接 new Factory 就可以了,代码如下:
其缺点也很明显,这个工厂不够灵活,就是每当要新增一个产品的时候,需要去修改这个工厂。
工厂方法模式
工厂方法模式就是每个对象都有自己对应的工厂,即要新增产品的时候不去原有的工厂里新增,直接新增一个对应的工厂。
抽象工厂模式
即它可以生产多个大类的产品,工厂方法模式只能生产某一大类的产品。比如工厂方法模式只能生产汽车,而抽象工厂模式不仅可以生产汽车,还可以生产手机等等产品。
以上是关于设计模式(单例工厂)的主要内容,如果未能解决你的问题,请参考以下文章