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

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

作者: 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