设计模式-java工厂模式2(抽象工厂模式)

java设计模式 抽象工厂模式

了解抽象工厂模式之前我们先来了解一个问题,一辆汽车有发动机,轮胎,空调等组成。他们都属于一辆车,如果使用工厂方法模式的话,我们就需要建立,发动机工厂,轮胎工厂,空调工厂等。这样产生了大量的工厂,但是如果使用抽象工厂模式就只需要建立一个汽车工厂就可以了。下面就以创建汽车的例子来讲解。

首先来了解两个概念:

  1. 产品等级结构:即产品的继承结构,比如一个抽象类是发动机,那么他的子类可能有:本田发动机,奔驰发动机等。有一个抽象类轮胎,那么他的子类可能有:本田轮胎,奔驰轮胎等。则抽象发动机与具体的品牌发动机(如:本田发动机)之间构成了一个产品等级结构。抽象轮胎类与具体的轮胎类(如:本田轮胎)之间构成了一个产品等级结构。

  2. 产品族:指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如”本田汽车工厂”生产本田汽车需要本田发动机、本田轮胎。本田发动机位于发动机产品等级结构中,本田轮胎位于轮胎产品等级中。本田发动机、本田轮胎构成了一个产品族。产品族和产品等级结构的关系如下图:
    产品族和产品等级结构

抽象工厂模式就是:用来创建一组相关或者相互依赖的对象(一个产品族里的对象)。比如:本田汽车使用本田发动机和本田轮胎,而奔驰汽车使用奔驰发动机和奔驰轮胎,那么使用抽象工厂模式,在为本田汽车生产相关配件时,就无需制定发动机和轮胎,它会自动根据车型生产配件。

抽象工厂模式主要涉及四种角色:

  1. 抽象工厂角色:是具体工厂必须实现的接口或抽象类,定义了创建不同产品族中涉及到的所有相关产品的创建。(汽车工厂生产汽车,需要涉及发动机,轮胎等)
  2. 具体工厂角色:实现或者继承至抽象工厂角色,是具体创建某一种产品族的工厂。(比如:奔驰工厂生产奔驰汽车,需要奔驰发动机,奔驰轮胎)
  3. 抽象产品角色:定义了产品,是具体产品需要实现的类(如:发动机,轮胎)
  4. 具体产品角色:继承至抽象产品角色,是具体产品的实现(如:本田发动机,奔驰发动机,本田轮胎,奔驰轮胎等)

抽象工厂模式的 UML图如下
抽象工厂模式

第一步:创建抽象产品角色:

/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:抽象发动机
 * Date:2017/11/29
 * Time:13:49
 */
public abstract class Engine {
    public abstract void getEngineInfo();
}
/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:抽象的轮胎
 * Date:2017/11/29
 * Time:13:54
 */
public abstract  class Tyre {
    public abstract void getTyreInfo();
}

第二步:创建具体的产品角色

/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:奔驰发动机
 * Date:2017/11/29
 * Time:13:57
 */
public class BenzEngine extends Engine{
    @Override
    public void getEngineInfo() {
        System.out.println("这是一个奔驰发动机");
    }
}
/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:本田发动机
 * Date:2017/11/29
 * Time:13:59
 */
public class HondaEngine extends  Engine{
    @Override
    public void getEngineInfo() {
        System.out.println("这是一个本田发动机");

    }
}
/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:奔驰轮胎
 * Date:2017/11/29
 * Time:13:58
 */
public class BenzTyre extends  Tyre {
    @Override
    public void getTyreInfo() {
        System.out.println("这是一个奔驰轮胎");

    }
}
/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:本田轮胎
 * Date:2017/11/29
 * Time:14:00
 */
public class HondaTyre extends  Tyre {
    @Override
    public void getTyreInfo() {
        System.out.println("这是一个本田轮胎");

    }
}

第三部:创建抽象工厂角色

/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:汽车抽象工厂
 * Date:2017/11/29
 * Time:14:03
 */
public interface CarFactory{

    /**
     * 创建发动机
     * @return
     */
    public Engine creatEngine();

    /**
     * 创建轮胎
     * @return
     */
    public  Tyre creatTyre();
}

第四步:创建具体的工厂角色


/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:奔驰汽车工厂
 * Date:2017/11/29
 * Time:14:08
 */
public class BenzFactory implements CarFactory {

    /**
     * 创建奔驰汽车产品族中的奔驰发动机
     * @return
     */
    @Override
    public Engine creatEngine() {
        return new BenzEngine();
    }

    /**
     * 创建奔驰汽车产品族中的奔驰轮胎
     * @return
     */
    @Override
    public Tyre creatTyre() {
        return new BenzTyre();
    }
}
/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:本田汽车工厂
 * Date:2017/11/29
 * Time:14:12
 */
public class HondaFactory  implements CarFactory{

    /**
     * 创建本田产品族中的本田引擎
     * @return
     */
    @Override
    public Engine creatEngine() {
        return new HondaEngine();
    }

    /**
     * 创建本田产品族中的本田轮胎
     * @return
     */
    @Override
    public Tyre creatTyre() {
        return new HondaTyre();
    }
}

第5部:测试

/**
 * Created by IntelliJ IDEA.
 * User:hubin
 * Description:
 * Date:2017/11/29
 * Time:14:17
 */
public class Test {
    public  static  void main(String agrs[]){
        /**
         * 如果我们需要创建一辆奔驰汽车,
         * 只需要创建一个奔驰汽车工厂,
         * 就可得到它需要的奔驰发动机和奔驰轮胎
         */
        System.out.println("生产一辆奔驰汽车:");
        CarFactory Benz = new BenzFactory();
        Benz.creatEngine().getEngineInfo();
        Benz.creatTyre().getTyreInfo();
        /**
         * 如果我们需要创建一辆本田汽车,
         * 只需要创建一个本田汽车工厂,
         * 就可得到它需要的本田发动机和本田轮胎
         */
        System.out.println("生产一辆本田汽车:");
        CarFactory Honda = new HondaFactory();
        Honda.creatEngine().getEngineInfo();
        Honda.creatTyre().getTyreInfo();

    }
}

运行结果为:
这里写图片描述

从上面可以看出,抽象工厂模式主要用于解决是创建一组产品(属于同一个产品族)的时候,而不是用于创建一个产品。
以上就是简单工厂模式,工厂方法模式,和抽象工厂模式。

猜你喜欢

转载自blog.csdn.net/hubin916/article/details/78663336