《图解设计模式》 第三部分 生成实例

第五章 Singleton 模式

单例模式应该是开发中用的比较多的模式。这里我只记一个知识点。
多线程下安全的单例模式的一个知识点

public class Singleton{
   public static InstanceClass instance = null;
   public static Singleton getInstance(){
    if(instance == null){
      sychronized{
        if(instance == null){
          instance = new InstanceClass();
        }
      }
    }
  }
}

这里为什么要 判断两次 instance == null ?

因为 sychronized 是重量级锁(Java早期版本),这是因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换到内核态,这个状态之间的转换需要相对比较长的时间,时间成本相对较高
因此提前 判断 是否为 null, 可以防止之后的程序一直去尝试获得锁。

第六章 Prototype 模式

Manager 类将各种原型类记录在一个HashMap里

    public class Manager {
        private HashMap<String,Product> showcase = new HashMap();

        public void register(String name, Product proto) {
            showcase.put(name,proto);
        }

        public Product create(String protoName) {
            Product product = (Product) showcase[protoName];
            return product.createClone();
        }
    }

接口 Product 类需要继承 Cloneable
当 Product 的子类可以通过clone 直接获取到相关类实现

publci class UnderlinePen implements Product{
  /*
  *省略
  */

  public Product createClone(){
    Product p = null;
    try{
      p = (Product) clone();
    } catch (CloneNotSupportedException e){
      e.printStachTrace();
    }
    return p;
  }
}

Messager 只需要创建的时候 根据实例名称 返回对应的克隆对象即可。

第七章 Build 模式

没什么讲的,使用的时候传入不同的 Builder 然后通过 Dirctor类 去执行 construct , 最后getResult 结果就可以了。

和Teamplete Method 模式有什么异同?

Teamplete Method 只有接口和实现类,接口通过 为 finnal 方法 控制行为。【finnal 就是为了防止子类修改】
但是Build 却是 Dirctor 的 construct 方法去控制行为。

第八章 Abstract Factory 模式

Builder 模式 和 Abstract Factory 模式 的关系

Abstract Factory 模式通过调用抽象产品接口来组成抽象产品,生成具有发杂结构的实例。
Builder 则是分阶段的制作发杂实例。
前者更强调组件化,因为组件多所以有 “工厂” 一说。后者则是只是负责调用,感觉操作性不是很强。

Factory Method 和 Abstract Factory 模式 的关系

抽象工厂 用到了 Factory Method 模式

posted @ 2024-11-04 18:46  大俗XD  阅读(12)  评论(0)    收藏  举报