设计模式(单例工厂)

Posted offerNotFound

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式(单例工厂)相关的知识,希望对你有一定的参考价值。

设计模式的六大原则

  1. 单一原则:一个类或者一个方法只负责一项职责,尽量做到类的只有一个行为原因引起变化。
  2. 里氏替换原则:子类可以扩展父类的功能,但不能改变原有父类的功能。
  3. 依赖倒置原则:面向接口编程(通过接口作为参数实现应用场景),抽象就是接口或者抽象类,细节就是实现类。
  4. 接口隔离:建立单一接口(复杂的接口,根据业务拆分成多个简单接口)。
  5. 迪米特原则:最少知道原则,尽量降低类与类之间的耦合(一个对象应该对其他对象有最少的了解)。
  6. 开闭原则:用抽象构建架构,用实现扩展原则。

单例模式

单例模式就是在整个运行时一个类只能构建一个实例对象。那为什么需要单例模式呢?因为有些类的实例的创建和销毁对资源来说消耗不大(比如 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 就可以了,代码如下:

其缺点也很明显,这个工厂不够灵活,就是每当要新增一个产品的时候,需要去修改这个工厂。

工厂方法模式

工厂方法模式就是每个对象都有自己对应的工厂,即要新增产品的时候不去原有的工厂里新增,直接新增一个对应的工厂。

抽象工厂模式

即它可以生产多个大类的产品,工厂方法模式只能生产某一大类的产品。比如工厂方法模式只能生产汽车,而抽象工厂模式不仅可以生产汽车,还可以生产手机等等产品。

以上是关于设计模式(单例工厂)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式详解

Gof 设计模式

单例模式,工厂模式

简单工厂-------And-----单例模式

PHP面向对象-设计模式 单例模式 简单工厂模式 工厂方法模式

设计模式:对象生成(单例工厂抽象工厂)