zoukankan      html  css  js  c++  java
  • 理解设计模式(工厂)

      工厂模式,见名知意:创建工厂,来生产商品。
      Java中,工厂和商品就是对象。

    使用时机
    工厂模式功能上相当于new,都是创建对象
    但前者名称决定,其具有工厂的特性

    • 工厂根据要求生产商品,商品种类并不单一
    • 工厂如何生产,外界不需要得知

    对于Java来说,工厂模式按条件获取不同类的对象,同时屏蔽对象的细节

    分为

    • 简单工厂
    • 工厂方法
    • 抽象工厂3种

    简单工厂模式 —— Simple Factory

    3个角色:工厂类F、抽象产品A、具体产品C
    具体来说,C实现A,F生产A,但实际C被创建
    一句话,父类变量指向子类对象

    F:由具体类实现,一般有判断和业务逻辑
    A:由接口或抽象类实现,一般有抽象方法,供C实现
    C:由具体类继承或实现A,F实际创建对象类

    CarFactory.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    package com.suzhw.design.pattern.factory.factory;

    import java.util.HashMap;
    import java.util.Map;

    import com.suzhw.design.pattern.factory.product.Car;
    import com.suzhw.design.pattern.factory.product.impl.AudiCar;
    import com.suzhw.design.pattern.factory.product.impl.BenZCar;
    import com.suzhw.design.pattern.factory.product.impl.QQCar;
    import com.suzhw.util.string.StringUtil;

    /**
    * @author suzhw<br>
    * 日期:2014-7-12<br>
    * 功能:根据需求,生产汽车<br>
    * @version 1.0
    * @see
    */
    public class CarFactory {
    private static Map<String, Integer> carType;

    static {
    CarFactory.carType = new HashMap<String, Integer>();
    CarFactory.carType.put("AudiCar", 1);
    CarFactory.carType.put("BenZCar", 2);
    CarFactory.carType.put("QQCar", 3);
    }

    public CarFactory() {
    }

    /**
    * 根据条件,生产汽车
    *
    * @param target
    * @throws Exception
    */
    public static Car produceCar(String target) throws Exception {
    if (StringUtil.isValidate(target)) {
    return proCarByTarget(target);
    } else {
    throw new Exception("原料不足,无法生产");
    }
    }

    /**
    * <pre>
    * @author suzhw
    * 2014-7-12 下午7:47:38
    * <b>作用:按条件,生产汽车</b>
    * <b>使用场合:内部方法,屏蔽生产细节</b>
    *
    * @param target
    * @return <br/>
    * return: Car
    * @throws Exception
    * @exception
    * @since 1.0.0
    * </pre>
    */
    private static Car proCarByTarget(String target) throws Exception {
    switch (CarFactory.carType.get(target)) {
    case 1:
    return new AudiCar();
    case 2:
    return new BenZCar();
    case 3:
    return new QQCar();
    default:
    throw new Exception("无法生产");
    }
    }
    }

    Car.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.suzhw.design.pattern.factory.product;

    /**
    * @author suzhw<br>
    * 日期:2014-7-12<br>
    * 功能:车<br>
    * @version 1.0
    * @see
    */
    public interface Car {
    /**
    * <pre>
    * @author suzhw
    * 2014-7-12 下午8:17:13
    * <b>作用:汽车启动</b>
    * <b>使用场合:汽车启动时</b>
    * <br/>
    * return: void
    * @exception
    * @since 1.0.0
    *</pre>
    */
    public void start();
    }

    AudiCar.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package com.suzhw.design.pattern.factory.product.impl;

    import com.suzhw.design.pattern.factory.product.Car;

    public class AudiCar implements Car {

    public void start() {
    System.out.println("奥迪车启动");
    }

    }

    BenZCar.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package com.suzhw.design.pattern.factory.product.impl;

    import com.suzhw.design.pattern.factory.product.Car;

    public class BenZCar implements Car {

    public void start() {
    System.out.println("奔驰车启动");
    }

    }

    QQCar.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package com.suzhw.design.pattern.factory.product.impl;

    import com.suzhw.design.pattern.factory.product.Car;

    public class QQCar implements Car {

    public void start() {
    System.out.println("QQ车启动");
    }

    }

    可以看出,简单工厂模式,产品抽象实现,而工厂具体实现
    如此,产品符合开闭原则
    可以不断扩展产品的种类,但每扩展一次,都要修改工厂类

    工厂方法模式避免了这种修改

    工厂方法模式 —— Factory Method

    相比于简单工厂模式,工厂方法模式的角色增加到4个

    • 抽象工厂:核心,与业务无关,接口或抽象类实现
    • 具体工厂:含业务逻辑,具体类实现
    • 抽象产品:接口或抽象类实现
    • 具体产品

    该模式,是一个工厂,只生产一种商品
    不过要先确定使用哪种工厂类

    抽象工厂模式 —— Abstract Factory

    先说等级结构产品族
    等级结构:相当于产品的不同品牌
    产品族:相当于不同品牌、但功能相似的产品集合

    抽象工厂模式,一个工厂,能够生产不同品牌下、功能相似产品组成的产品族

    工厂接口中可不声明方法
    若已知产品族数量时,可以按需声明
    若产品族数量发生变化,则可重新声明工厂接口

  • 相关阅读:
    103. 二叉树的锯齿形层次遍历
    102. 二叉树的层次遍历
    94. 二叉树的中序遍历
    Redis和数据库 数据同步问题
    203. 移除链表元素
    19. 删除链表的倒数第N个节点
    237. 删除链表中的节点
    141. 环形链表
    2. 两数相加
    143. 重排链表
  • 原文地址:https://www.cnblogs.com/CoolSoul/p/4984917.html
Copyright © 2011-2022 走看看