Java设计模式之三 —— 抽象工厂

来源:互联网 发布:好看的自拍软件 编辑:程序博客网 时间:2024/05/22 03:23

      1.问题提出

      书接前文,我们有家工厂,生产的产品Product有两种,一种是飞机ProductA,一种是汽车ProductB,我们已经采用了FactoryMethod工厂方法进行对象的构建,那么现在我们的业务更加细化了如下:

 

A.飞机 —— ProductA

  1. 军用飞机 —— ProductA1
  2. 民用飞机 —— ProductA2

B.汽车 —— ProductB

  1. 军用汽车 —— ProductB1
  2. 民用汽车 —— ProductB2

      2.类图设计

 

      3.代码编写

      1)定义Product接口:

 

public interface Product
{
    public void printProduct();
}

 

      2)定义ProductA、ProductB接口:

 

public interface ProductA extends Product
{
    public void printProduct();
}
public interface ProductB extends Product
{
    public void printProduct();
}

 

      3)定义ProductA1、ProductA2和ProductB1、ProductB2:

 

public class ProductA1 implements ProductA
{
    public void printProduct()
    {
        System.out.println("ProductA1");
    }
}

public class ProductA2 implements ProductA
{
    public void printProduct()
    {
        System.out.println("ProductA2");
    }
}

public class ProductB1 implements ProductB
{
    public void printProduct()
    {
        System.out.println("ProductB1");
    }
}

public class ProductB2 implements ProductB
{
    public void printProduct()
    {
        System.out.println("ProductB2");
    }
}

 

      4.运行结果

      下面我们写一个Client来进行测试:

 

public class Client
{
    public static void main(String[] args)
    {
        //定义一个军用产品的构造器
        ProductCreator productCreator1 = new ProductCreator1();
        //定义一个民用产品的构造器
        ProductCreator productCreator2 = new ProductCreator2();

        //使用军用工厂方法,构建一个军用飞机
        ProductA productA1 = productCreator1.factoryA();
        //使用民用工厂方法,构建一个民用飞机
        ProductA productA2 = productCreator2.factoryA();

        //使用军用工厂方法,构建一个军用汽车
        ProductB productB1 = productCreator1.factoryB();
        //使用民用工厂方法,构建一个民用汽车
        ProductB productB2 = productCreator2.factoryB();

        //控制台输出军用飞机
        productA1.printProduct();
        //控制台输出民用飞机
        productA2.printProduct();
        //控制台输出军用汽车
        productB1.printProduct();
        //控制台输出民用汽车
        productB2.printProduct();
    }
}

 

      运行结果如下:

 

      5.总结

  • 优点 —— 抽象工厂模式帮我们控制一个应用创建的对象类。封装了创建产品的过程,他与客户端分离,客户通过他们的抽象接口操纵实例,产品的类名也不出现在客户端代码中。一个具体的工厂类在一个应用中仅仅出现一次,也就是说在它初始化的时候。这是的改变一个应用的具体工厂变得很容易,我们只需要改变具体的工厂即可使用不同的产品配置。使用抽象工程模式有利于产品的一致性,当一系列的产品对象在一起工作时,一个应用一次只能使用同一个系列中的对象。
  • 缺点 —— 难以支持心中类的产品,抽象工厂AbstractFactory接口确定了可以被创建的产品集合,如果想让它支持一种新的产品,就必须要扩展该工厂的接口,这将涉及到AbstractFactory类和它的所有子类的改变。