1.问题提出
书接前文,我们有家工厂,生产的产品Product有两种,一种是飞机ProductA,一种是汽车ProductB,我们已经采用了FactoryMethod工厂方法进行对象的构建,那么现在我们的业务更加细化了如下:
A.飞机 —— ProductA
- 军用飞机 —— ProductA1
- 民用飞机 —— ProductA2
B.汽车 —— ProductB
- 军用汽车 —— ProductB1
- 民用汽车 —— ProductB2
2.类图设计
3.代码编写
1)定义Product接口:
public
interface Product
{
public void printProduct();
}
{
public void printProduct();
}
2)定义ProductA、ProductB接口:
public
interface ProductA
extends Product
{
public void printProduct();
{
public void printProduct();
}
public
interface ProductB
extends Product
{
public void printProduct();
}
{
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" );
}
}
{
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();
}
}
{
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类和它的所有子类的改变。