一. 定义 提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类。
二. 结构
三. 参与者
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";
}
}
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
参考书籍:
《设计模式 : 可复用面向对象软件的基础》
《Effective Java》
《Head First 设计模式》