抽象工厂模式
抽象工厂模式是创建模式,是工厂方法模式进一步的推广。
抽象工厂模式向客户端提供一个接口,客户端可以不需要指定创建产品的具体类型创建多个产品族的对象。
结构与角色
涉及到角色:
- 抽象工厂角色(Creator)
这个角色是工厂方法模式的核心,任何创建产品对象的工厂类都必须实现这个接口。在实际的系统中这个角色也可以是一个java的抽象类。 - 具体工厂角色(Concrete Creator)
这个角色是实现了抽象工厂接口的java类,含有与应用密切相关的逻辑,并且受到应用程序的调用创建产品。 - 抽象产品角色(Product)
工厂方法模式创建产品对象的超类,也是产品对象共同的父类或共同的接口。实际系统中这个对象常常用java抽象类实现 - 具体产品角色(Concrete Product)
这个角色实现了抽象产品角色定义的接口,工厂方法模式创建的每一个对象都是某个具体产品实例。
实现
1.抽象工厂角色(Creator)
抽象工厂角色提供两个工厂方法,以创建两个不同产品族对象
public interface Factory
{
// 产品族A的工厂方法
public ProductA factoryA();
// 产品族B的工厂方法
public ProductB factoryB();
}
2.抽象产品角色(Product)
两个产品族抽象对象
public interface ProductA
{
}
public interface ProductB
{
}
3.具体产品角色(Concrete Product)
每个产品族有两个具体产品
public class ProductA1 implements ProductA
{
public ProductA1(){
System.out.println("生成产品a1");
}
}
public class ProductA2 implements ProductA
{
public ProductA2(){
System.out.println("生成产品a2");
}
}
public class ProductB1 implements ProductB
{
public ProductB1(){
System.out.println("生产产品b1");
}
}
public class ProductB2 implements ProductB
{
public ProductB2(){
System.out.println("生产产品b2");
}
}
4.具体工厂角色(Concrete Creator)
public class ConcreteFactory1 implements Factory
{
@Override
public ProductA factoryA()
{
return new ProductA1();
}
@Override
public ProductB factoryB()
{
return new ProductB1();
}
}
public class ConcreteFactory2 implements Factory
{
@Override
public ProductA factoryA()
{
return new ProductA2();
}
@Override
public ProductB factoryB()
{
return new ProductB2();
}
}
5.客户端
public class Client
{
public static void main(String[] args)
{
Factory concreteFactory1 = new ConcreteFactory1();
Factory concreteFactory2 = new ConcreteFactory2();
concreteFactory1.factoryA();
concreteFactory2.factoryA();
concreteFactory1.factoryB();
concreteFactory2.factoryB();
}
}
例子中有两个抽象产品,所以工厂角色中提供了两个工厂方法。有多少抽象产品,就有多少工厂方法。增加新的抽象产品需要修改每一个工厂角色。
抽象产品数目不变,增加新的产品只需要增加新的工厂就可以。