2020-05-24 工厂模式和单例模式
工厂模式:
当使用new实例化一个类时,使用的是实现,而不是接口,代码捆绑着具体类会导致代码更脆弱缺乏弹性,使用松耦合的OO模式可以得到解脱。
工厂:封装对象的创建,处理创建对象的细节
静态工厂:利用静态方法定义一个简单的工厂。优点:不需要创建工厂类的实例化。缺点:不能通过继承改变创建方法行为。
简单工厂:简单工厂并不是一种设计模式,因为只是简单的把创建对象的代码封装起来
工厂模式:在父类定义了一个创建对象的接口,通过让子类决定创建的对象是什么,来达到让对象创建的过程封装的目的。工厂方法让类把实例化推迟到子类
抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要指明具体的类
特点:
工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样客户程序中超类的代码就和子类对象的创建部分解耦了
简单工厂vs工厂模式:简单工厂把全部的事情在一个地方做完了,而工厂模式是一个创建框架,让子类决定如何实现
抽象工厂vs工厂模式
抽象工厂的方法经常以工厂方法的方式实现,抽象工厂的任务是定义一个负责创建一组产品的接口
工厂方法使用继承,抽象工厂使用组合
工厂方法只是用来创建一种产品,而抽象工厂创建的是一个产品家族
使用工厂模式意味着需要扩展一个类并覆盖它的工厂方法。抽象工厂提供了一个创建产品家族的抽象类型,类型的子类定义了产品生产的方式
设计原则:
依赖倒置原则:要依赖抽象,不要依赖具体类。高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
变量不要持有具体类的引用
不要让类派生至具体类
不要覆盖基类中实现的方法
单例模式:
单例模式:确保一个类只有一个实例,并提供一个全局访问点。
特点:
单例模式确保一个实例被创建,并且任意时刻都只有一个对象。
特征是构造函数为私有,然后声明一个私有静态成员作为类对象,对外提供一个静态类方法创建该对象
在创建对象时会先判断是否已经创建,若是则直接返回已经创建的对象,若没有则创建新对象
用途:
某些对象在程序运行过程中我们只需要一个,或只能生成一个,如线程池、注册表和代表打印机的对象等。如果创建多个实例就会发生异常。
如果将对象赋给某个全局变量(急切初始化),即事先就建立好对象,若对象在本次程序执行没有使用且占用很多资源就不是很合适
注意:
即使正确创建了单件模式类,但当使用多个类加载器时,每个类加载器定义了各自的命名空间,当不同的类加载器加载了同一个类,从整体程序上看,同一个类就会被加载多次,造成多个单件的存在。解决办法:自行指定同一个类加载器
单件类不能被继承,因为构造方法是私有的,如果这的把构造器的权限改变了,想要让子类能够顺利工作,基类必须实现注册表功能。即创建对应Map<String(class.name), instance>,用来记录类是否被创建以及被创建的实例
多线程问题:当有多个变成并发执行时,可能无法保证单件。解决办法:只要把getInstance()变成同步(synchronized)方法
并发与性能问题:解决:使用双重加锁检验机制,先检验是否创建,如未创建再同步