JAVA设计模式之 抽象工厂模式【Abstract Factory Pattern】

一、概述

    抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。


二、适用场景

    为创建一组对象提供了一种解决方案。


三、UML类图


四、参与者

(1)    AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。如上图UML类图中的Factory。

(2)    ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。如上图UML类图中的Factory1 和Factory2。

(3)    AbstractProduct(抽象产品):它为每种产品声明接口,如上图UML类图中的ProductA和ProductB。

(4)    ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。如上图UML类图中的ConcreteProductA1/A2/B1/B2。


五、用例学习

(1) 产品类型A接口: ProductA.java

/**
 * 产品类型A接口
 * @author lvzb.software@qq.com
 *
 */
public interface ProductA {

}
(2)产品类型B接口: ProductB.java

/**
 * 产品类型B接口
 * @author  lvzb.software@qq.com
 *
 */
public interface ProductB {

}
(3) 具体的A类型产品A1: ConcreteProductA1.java

/**
 * 具体的A类型产品A1
 * @author lvzb.software@qq.com
 *
 */
public class ConcreteProductA1 implements ProductA {

	public ConcreteProductA1(){
		System.out.println("产品A1 已创建...");
	}
}
(4) 具体的A类型产品A2: ConcreteProductA2.java

/**
 * 具体的A类型产品A2
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteProductA2 implements ProductA {

	public ConcreteProductA2() {
		System.out.println("产品A2 已创建...");
	}
}
(5) 具体的B类型产品B1: ConcreteProductB1.java

/**
 * 具体的B类型产品B1
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteProductB1 implements ProductB {

	public ConcreteProductB1(){
		System.out.println("产品B1 已创建...");
	}
}
(6) 具体的B类型产品B2: ConcreteProductB2.java

/**
 * 具体的B类型产品B2
 * @author  lvzb.software@qq.com
 *
 */
public class ConcreteProductB2 implements ProductB {

	public ConcreteProductB2(){
		System.out.println("产品B2 已创建...");
	}
}
(7) 创建产品的工厂接口: Factory.java

/**
 * 创建产品族的工厂接口
 * @author  lvzb.software@qq.com
 *
 */
public interface Factory {
	
	public ProductA createProductA();
	
	public ProductB createProductB();

}
(8) 具体的"工厂一"类:只负责生产A1、B1等1族甲级优产品: ProductFactory1.java

/**
 * 具体的"工厂一"类:只负责生产A1、B1等1族甲级优产品
 * @author  lvzb.software@qq.com
 *
 */
public class ProductFactory1 implements Factory {

	@Override
	public ProductA createProductA() {
		return new ConcreteProductA1();
	}

	@Override
	public ProductB createProductB() {
		return new ConcreteProductB1();
	}

}
(9) 具体的"工厂二"类:只负责生产A2、B2等2族乙级劣产品: ProductFactory2.java

/**
 * 具体的"工厂二"类:只负责生产A2、B2等2族乙级劣产品
 * @author  lvzb.software@qq.com
 *
 */
public class ProductFactory2 implements Factory {

	@Override
	public ProductA createProductA() {
		return new ConcreteProductA2();
	}

	@Override
	public ProductB createProductB() {
		return new ConcreteProductB2();
	}

}
(10) 客户端 Client:Client.java

public class Client {

	public static void main(String[] args) {
		Factory factory1 = null;
		System.out.println("工厂一 是正规工厂  生产的产品是正品");
		factory1 = new ProductFactory1();
		factory1.createProductA();
		factory1.createProductB();
		
		System.out.println("-------------");
		
        Factory factory2 = null;
        System.out.println("工厂二 是黑工厂  生产的产品是次品");
		factory2 = new ProductFactory2();
		factory2.createProductA();
		factory2.createProductB();
		
	}
}
(11) 运行结果 如下:

工厂一 是正规工厂  生产的产品是正品
产品A1 已创建...
产品B1 已创建...
-------------
工厂二 是黑工厂  生产的产品是次品
产品A2 已创建...
产品B2 已创建...

六、其他/扩展/优缺点

    抽象工厂模式是工厂方法模式的进一步延伸。在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值