天天看点

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

一. 定义  提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类。

二. 结构

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

三. 参与者        

Product (Fruit和Leaf两个抽象产物) : 抽象生产者接口;

TreeFruit(树上的水果)、 TreeLeaf(树上的叶子)、 GroundFruit(地上的水果)、 GroundLeaf(地上的叶子) : 实际的自然产物;

NatureFactory: 抽象的自然制造工厂, 用于生产水果和叶子;

TreeFactory、 LeafFactory : 实际的自然制造工厂, 用于生产树上或地上的水果和叶子。

四. 适用性 

- 一个系统独立(解耦)于它的产品的创建、 组合和表示时

- 一个系统要由多个它的产品的创建、组合(以上的自然界需要水果和叶子的组合)和表示时

- 强调一系列相关的产品对象的设计以便进行联合使用时

- 提供一个产品库, 而只想显示接口(面向接口编程)而不是实现时。

五. 具体实现

抽象工厂: 制造大自然中的叶子和水果 

package com.wenniuwuren.abstractfactory;
/**
 * 抽象工厂: 制造大自然中的叶子和水果 
 * @author wenniuwuren
 *
 */
public interface NatureFactory {

	public Fruit createFruit();
	
	public Leaf createLeaf();
}
           

工厂实现类: 制造地面上的叶子和水果

package com.wenniuwuren.abstractfactory;

/**
 * 工厂实现类: 制造地面上的叶子和水果
 * @author wenniuwuren
 *
 */

public class GroundFactory implements NatureFactory {

	@Override
	public Fruit createFruit() {
		return new GroundFruit();
	}

	@Override
	public Leaf createLeaf() {
		return new GroundLeaf();
	}

}
           

工厂实现类:制造树上的水果和叶子

package com.wenniuwuren.abstractfactory;

/**
 * 工厂实现类:制造树上的水果和叶子
 * @author wenniuwuren
 *
 */
public class TreeFactory implements NatureFactory {

	@Override
	public Fruit createFruit() {
		return new TreeFruit();
	}

	@Override
	public Leaf createLeaf() {
		return new TreeLeaf();
	}

}
           

水果接口:

package com.wenniuwuren.abstractfactory;

/**
 * 水果接口
 * @author wenniuwuren
 *
 */
public interface Fruit {
  public String product();
}
           

水果实现类:地上的水果

package com.wenniuwuren.abstractfactory;

/**
 * 水果实现类:地上的水果
 * @author wenniuwuren
 *
 */
public class GroundFruit implements Fruit {

	@Override
	public String product() {
		return "GroundFruit";
	}

}
           

水果实现类: 树上的水果

package com.wenniuwuren.abstractfactory;

/**
 * 水果实现类: 树上的水果
 * @author wenniuwuren
 *
 */
public class TreeFruit implements Fruit {

	@Override
	public String product() {
		return "TreeFruit";
	}

}
           

叶子接口:

package com.wenniuwuren.abstractfactory;

/**
 * 叶子接口
 * @author wenniuwuren
 *
 */
public interface Leaf {
	public String product();
}
           

叶子实现类: 地上的叶子

package com.wenniuwuren.abstractfactory;

/**
 * 叶子实现类: 地上的叶子
 * @author wenniuwuren
 *
 */
public class GroundLeaf implements Leaf {

	@Override
	public String product() {
		return "GroundLeaf";
	}

}
           

叶子实现类:树上的叶子

package com.wenniuwuren.abstractfactory;

/**
 * 叶子实现类:树上的叶子
 * @author wenniuwuren
 *
 */
public class TreeLeaf implements Leaf {

	@Override
	public String product() {
		return "TreeLeaf";
	}

}
           

测试类:Client

package com.wenniuwuren.abstractfactory;

public class Client {

	public static void main(String[] args) {
		
		// 生产树上的水果
		//Fruit fruit = new TreeFruit(); //没用抽象工厂时的调用方法
		NatureFactory natureFactory = new TreeFactory();
		Fruit fruit = natureFactory.createFruit();
		System.out.println(fruit.product()); 
		
		// 生产树上的叶子
		Leaf leaf = natureFactory.createLeaf();
		System.out.println(leaf.product());
		
		// 生产地上的水果
		natureFactory = new GroundFactory();
		fruit = natureFactory.createFruit();
		System.out.println(fruit.product()); 
		
		// 生产地上的叶子
		leaf = natureFactory.createLeaf();
		System.out.println(leaf.product());
	}
}
           

测试结果:

TreeFruit

TreeLeaf

GroundFruit

GroundLeaf

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。

参考书籍:

                《设计模式 : 可复用面向对象软件的基础》

                《Effective Java》

                《Head First 设计模式》

继续阅读