zoukankan      html  css  js  c++  java
  • 公用技术——设计模式2,3,4——创建型模式——简单工厂,工厂方法,抽象工厂

    1、概念

    工厂模式”封装”了复杂的类体系结构,额外提供工厂类,返回类体系结构的核心对象,方便用户使用。这样用户就只需要了解核心对象,而不用去详细了解整个类体系结构,大大简化和方便了框架的调用。

    工厂模式有三种,简单工厂,工厂方法模式,抽象工厂模式。本文中只介绍工厂方法模式,其他两种模式都是相似的。

    在使用工厂模式时需要注意工厂类的唯一职责是创建核心对象,不应该被赋予更多的职责。

    对于某些很容易理解的类结构,创建额外的工厂类反而会导致类结构变的复杂,例如Fruit下面有三个子类Apple,Banana,Watermelon。

    2、UML图

    3、代码

      额外提供工厂接口,以及对应的实现类。

    3.1 工厂接口类

    /**
     * 
     * @File Name: CoreObjectFactory.java 
     * @Description: 为了创建核心对象而提供的工厂类接口
     * @version 1.0
     * @since JDK 1.8
     */
    public interface CoreObjectFactory {
    	
    	/**
    	 * 
    	 * @Title: createCoreObject
    	 * @Description:创建核心对象
    	 * @return
    	 */
    	CoreObject createCoreObject();
    	
    	/**
    	 * @Title: createCoreObject
    	 * @Description:创建核心对象,上述方法的重载
    	 * @param props 核心对象需要的核心属性
    	 * @return
    	 */
    	CoreObject createCoreObject(CoreProperty props);
    }

     3.2 默认的工厂接口实现类

    /**
    * @File Name: DefaultCoreObjectFactory.java 
     * @Description: 工厂接口类的默认实现
     * @version 1.0
     * @since JDK 1.8
     */
    public class DefaultCoreObjectFactory implements CoreObjectFactory {
    
    	@Override
    	public CoreObject createCoreObject() {
    		// 写创建CoreObject的逻辑
    		return null;
    	}
    
    	@Override
    	public CoreObject createCoreObject(CoreProperty props) {
    		// 编写创建CoreObject的逻辑
    		return null;
    	}
    }
    

    4、讨论

      问题1:简单工厂,工厂方法,抽象工厂三者有什么区别?

      答:工厂模式的主要职责都是创建对象,三者的区别体现在所创建对象的复杂度上。

      对于简单工厂模式,它所创建的对象较为简单,根据工厂方法的参数判断返回对象的类型。

      工厂方法模式,在类结构上做了升级,额外的创建了工厂接口和实现类,工厂接口中封装了创建对象的方法,实现类提供具体的实现细节,不同的实现类有着不同的实现方式和不同的子类。

      抽象工厂方法模式,它所创建的对象一般较为复杂,需要很多”零部件”,为每种”零部件”提供不同的工厂接口和实现类。例如日常生活中的电脑,显示器,芯片,键盘,鼠标等这些零部件都由不同的厂商提供。

      它的核心思想在于整体与局部的解耦,例如鼠标类型和电脑类型完全是独立的,你可以在华硕电脑上配置达尔优鼠标,雷蛇鼠标,也可以在联想电脑上配置。换一种鼠标类型对电脑没有影响,换一种电脑类型对鼠标也没有任何影响。

    5、示例

    1. Mybatis框架中的SqlSessionFactory,返回核心的sqlSession对象
    2. Log4j或者是logback框架中的LoggerFactory,返回核心的Logger对象。尤其是Logger,基本上每天都在使用。
  • 相关阅读:
    javascript 学习笔记
    vim折叠设置(转载)
    描述符
    python运算符优先级
    python repr()和str()
    python super()
    [深入Python]__new__和__init__
    python中,类方法和静态方法区别。
    python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
    关于字符集和字符编码自己汇总记录
  • 原文地址:https://www.cnblogs.com/rain144576/p/9940926.html
Copyright © 2011-2022 走看看