<java与模式> ---电子书
抽象工厂模式:page171 第14章
抽象工厂的用意是使客户端在不必指定产品的具体的情况下创建多个产品族中的产品对象;
抽象工程模式是对象的创建模式。
在什么情况下用抽象工厂模式:
1、 一个系统不应当依赖产品类实例如何创建、组合和表达的细节,这对与所有形态的工厂模式都是重要的。
2、这个系统的产品有多于一个的产品族,而系统只消耗其中某一族的产品
3、同属于一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来
4、系统提供一个产品类的库,所以的产品以同样的接口出现,从而使客户端不依赖于实现。
扩展:
1、产品的等级结构扩展,也就是当在增加一个平行等级新的产品时,抽象工程不支持“开—闭”原则
2、在增加新产品族的时,支持开-闭原则。
问题:为什么上面的抽象工厂和抽象产品没有依赖关系呢?(在工厂方法模式中)在这里我们同样用了抽象产品的接口作为抽象工厂的返回接口呀!
第15章 单例模式 page201
单例模式的要点:
1、 某个类只可以有一个实例
2、 该类必须自行创建实例
3、 它必须自行向整个系统提供这个实例
一、 汉式单例类
该类自己含有一个实现自己实例的静态方法,同时为了不让外界创建实例,则它的构造方法必须是私有的。
代码测试:
class EagerSimple{
private static final EagerSimple eager = new EagerSimple();
private EagerSimple{}
public static EagerSimple getInstance(){
return eager;
}
}
二、懒汉式单例类
它也饿汉式单例类不同的是,只有当自己被引用的时候,自己才被实例化。结构图与饿汉式单例类一样的。
代码测试:
class LanSimple{
private static LanSimple simple= null;
private LanSimple(){}
synchronized public static LanSimple getInstance(){
if(simple == null)
simple = new LanSimple();
return simple;
}
}
饿汉式单例类与懒汉式单例类的区别是:在时间和反映上说,饿汉式要比懒汉式好,但是从资源利用上则饿汉式要好。
双重检查成例的“懒汉式”单例类:
class LazySimple{
private LazySimple(){}
private static LazySimple lazy = null;
public static LazySimple getInstance(){
if(lazy == null){
synchronized(lazy){
if(lazy == null){
lazy = new LazySimple();
}
}
}
return lazy;
}
}
这个代码看上去并没有步合理之出,而且我认为还相当有意义,可是为什么说在java中就不对呢?不能够使用呢?问题在哪里?