抽象工厂模式-创建型模式3

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据LSP原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
定义:
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

结构:
抽象工厂模式-创建型模式3_第1张图片
说明:
    AbstractFactory:抽象工厂的接口,声明创建抽象产品对象的操作
    ConcreteFactory:具体的工厂实现对象,实现创建具体的产品对象的操作
    AbstractProduct:抽象产品的接口
    ConcreteFactory:具体的工厂实现对象,实现创建具体的产品对象的操作
    Client:客户端
具体代码:

/**
 * 抽象工厂的接口,声明创建抽象产品对象的操作
 */
public interface AbstractFactory {
	/**
	 * 示例方法,创建抽象产品A的对象
	 * @return 抽象产品A的对象
	 */
	public AbstractProductA createProductA();
	/**
	 * 示例方法,创建抽象产品B的对象
	 * @return 抽象产品B的对象
	 */
	public AbstractProductB createProductB();
}
/**
 * 抽象产品A的接口
 */
public interface AbstractProductA {
	//定义抽象产品A相关的操作
}
/**
 * 抽象产品B的接口
 */
public interface AbstractProductB {
	//定义抽象产品B相关的操作
}
/**
 * 具体的工厂实现对象,实现创建具体的产品对象的操作
 */
public class ConcreteFactory1 implements AbstractFactory {

	public AbstractProductA createProductA() {
		return new ProductA1();
	}
	public AbstractProductB createProductB() {
		return new ProductB1();
	}
}
/**
 * 具体的工厂实现对象,实现创建具体的产品对象的操作
 */
public class ConcreteFactory2 implements AbstractFactory {

	public AbstractProductA createProductA() {
		return new ProductA2();
	}
	public AbstractProductB createProductB() {
		return new ProductB2();
	}
}
/**
 * 产品A的具体实现
 */
public class ProductA1 implements AbstractProductA {
	//实现产品A的接口中定义的操作
}
/**
 * 产品A的具体实现
 */
public class ProductA2 implements AbstractProductA {
	//实现产品A的接口中定义的操作
}
/**
 * 产品B的具体实现
 */
public class ProductB1 implements AbstractProductB {
	//实现产品B的接口中定义的操作
}
/**
 * 产品B的具体实现
 */
public class ProductB2 implements AbstractProductB {
	//实现产品B的接口中定义的操作
}
public class Client {

	public static void main(String[] args) {
		//创建抽象工厂对象
		AbstractFactory af = new ConcreteFactory1();
		//通过抽象工厂来获取一系列的对象,如产品A和产品B
		af.createProductA();
		af.createProductB();
	}
}
使用场景:
这里有两个产品族:windowns产品族和unix产品族。 Windowns产品族有winButton和winText组成,unix产品族由UnixButton和UnixText组成。我们可以创建两个工厂winFactory和unixFactory。winFactory负责创建windowns产品族中的产品,unixFactory负责创建unxi产品族中的产品。这就是抽象工厂模式的应用。
有点和缺点:
抽象工厂模式是否支持OCP呢? 答案:增加新的产品族不需要修改原有的代码,是支持开闭原则的。增加新的产品等级结构需要在原有的工厂类里面增加一个工厂方法,是不支持开闭原则的。
留给自己的问题:

你可能感兴趣的:(抽象工厂模式)