1.Factory Method模式和Abstract Factory模式的区别在哪?一般哪些情况下适合用前者,哪些情况下适合用后者?
1)不同之处主要在于:
应用环境不同:FM中创建者的职责并不仅限于创建对象,而AF通常只有创建对象这一职责。
实现方式不同:FM是实现继承,抽象类实现大部分操作,通常仅将对象的创建工作延迟到子类来完成;AF是接口继承,抽象类通常不实现任何功能,仅仅定义一系列接口,子类实现抽象类定义的接口。
Factory Method模式与Abstract Factory模式的区别
2)
在这些情况下使用Factory Method:
当一个类不知道它所必须创建的对象的类的时候;
当一个类希望由它的子类来指定它所创建的对象的时候;
当类将创建对象的职责委托给多个帮助子类中的某一个,并且程序员希望将哪一个帮助子类是代理者这一信息局部化的时候。
在这些情况下使用Abstract Factory:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
2.解释Java中clone()方法和ng.Cloneable接口的关系,如果想要实现深拷贝可以有哪些方法?
1)cloneable接口中的一个方法是clone方法,实现cloneable接口必须实现接口中包含的clone 方法。
如果在没有实现Cloneable 接口的实例上调用Object的clone方法,则会导致抛出CloneNotSupportedException 异常。
2)实现深拷贝的方法:
实现ICloneable接口,自定义拷贝功能;
通过反射实现;
序列化/反序列化类实现。
3. ng.Math类和ng.StrictMath类是否是单例模式?
都不是单例模式。
原因:
这两个类均有一个私有的构造函数。
但是这仅仅是单例模式的必要条件,而不是充分条件。
根据单例模式的三个特性可以看出,无论是Math 还是StrictMath 都没有为外界提供任何自身的实例。
实际上,这两个类都是被设计来提供静态工厂方法和常量的,因此从来就不需要它们的实例,这才是它们的构造子是私有的原因。
4. 如何保证单例模式中单例的线程安全?请列举两种或以上方法。
1)将类的构造函数设计为私有的,并提供一个public static方法,返回这个对象的指针。
若这个函数返回的是null,则可以创建一个对象;否则不能创建新的对象。
另外,由于多线
程可能出现同时访问临时变量的问题,在public方法前加一个synchronized关键字,实现线程同步。
2)在public方法中利用加锁和释放锁实现线程同步。
3)放弃使用synchronized 关键字,而使用static 关键字:
这种方式没有使用同步,并且确保了调用static getInstance()方法时才创建Singleton的引用(static 的成员变量在一个类中只有一份)。
4)
在ResourceFactory中加入了一个私有静态内部类ResourceHolder ,对外提供的接口是getResource()方法,也就是只有在ResourceFactory .getResource()的时候,Resource对象才会被创建。