设计模式(单例、工厂)

设计模式的六大原则

  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 就可以了,代码如下:
在这里插入图片描述
其缺点也很明显,这个工厂不够灵活,就是每当要新增一个产品的时候,需要去修改这个工厂。

工厂方法模式

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

抽象工厂模式

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值