美文网首页
<<设计模式之禅(第二版)>>——第八章

<<设计模式之禅(第二版)>>——第八章

作者: leiiiooo | 来源:发表于2016-10-12 10:05 被阅读21次
定义:
  • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
通用表示:
工厂方法模式的通用表示形式
 code
工厂方法模式的拓展
  • 缩小为简单工厂模式:如果一个模块仅需要一个工厂类,没有必要把他生产出来,使用静态方法就可以了,根据这一要求,去除抽象类使用静态方法创建相关的对象即可,做出如下简化:
before after
public class ConcreteFactory  {
  public <T extends Product> T static createProduct(Class<T> c) {
      // TODO Auto-generated method stub
      Product product = null;
      try {
        product = (Product) Class.forName(c.getName()).newInstance();
      } catch (Exception e) {
        // 异常处理
      }
      return (T) product;
   }
 }
  • 升级为多个工厂类,复杂的应用中一般采用多工厂的方法,然后再增加一个协调类,避免调用者和各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。
多工厂类图
public abstract class AbstractFactory {
  public abstract Human createHuman();
}

public class BlackHumanFactory extends AbstractFactory{

@Override
public Human createHuman() {
    // TODO Auto-generated method stub
    return new BlackHuman();
  }
}
  • 替代单例模式
替代单例类类图
public class SingleInstance {
  // 私有化构造函数
  private SingleInstance() {
  };

  public void doSomething() {
    // 相关业务处理
  }
}

public class SingleInstanceFactory {
  private static SingleInstance singleInstance;

  static {
    try {
        Class clazz = Class.forName(SingleInstance.class.getName());
        Constructor constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        singleInstance =(SingleInstance)constructor.newInstance();
    } catch (Exception e) {
        // 异常处理
    }
  }

  public static SingleInstance getSingleInstance(){
    return singleInstance;
  }
}
  • 延迟加载模式:一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用。
延迟初始化的通用类图
//创建延迟加载的工厂类
public class ProductDelayDemo {
// 创建一个静态变量存储已有的数据
private static final Map<String, Product> prMap = new HashMap();

public static synchronized Product createProduct(String type) throws Exception {
    Product product = null;
    if (prMap.containsKey(type)) {
        product = prMap.get(type);
    } else {
        if (type.equals("ProductOne")) {
            product = new ProductOne();
        } else {
            product = new ProductTwo();
        }
    }

    return product;
  }
}

相关文章

网友评论

      本文标题:<<设计模式之禅(第二版)>>——第八章

      本文链接:https://www.haomeiwen.com/subject/ecpbyttx.html