对于工厂方法模式来说,其创建的对象相当于一个个零件,通常我们都需要将这些零件组合拼出一个完整的产品才能使用,但各个工厂生产的零件规格是不同的,导致了零件之间有着依赖关系,而工厂方法模式是无法建立这种依赖关系的,所以引出了抽象工厂模式,在抽象工厂中可以创建一系列具有依赖关系的对象。
1. 认识抽象工厂模式
1. 定义:提供一个创建一系列相关或互相依赖的对象的接口,而无需指定它们具体的类。
2. 组成结构:
- AbstractFactory:抽象工厂类,定义创建一系列对象的操作接口
- Factory:AbstractFactory的具体实现类,实现抽象工厂中定义的方法,具体实现创建一系列对象的操作接口
- AbstractProduct:定义一类对象的接口
- Product:AbstractProduct的具体实现类,
- client:通过抽象工厂对象来创建所需要的对象
3. 参考代码实现:
//AbstractProductA接口的具体实现类和AbstractProductB接口的具体实现类
//所创建的对象在应用时有着一定的关系,或者说相互匹配,比如ProductA1对应ProductB1
//举个例子,就好比CPU与主板,CPU有多少个针脚,那么主板上的CPU针脚数目必须对应
//CPU就是AbstractProductA接口,主板就相当于AbstractProductB接口
public interface AbstractProductA {
//定义一些操作接口
public void test();
}
public interface AbstractProductB {
public void test();
}
//
public class ProductA1 implements AbstractProductA {
@Override
public void test() {
System.out.println("productA1");
}
}
public class ProductB1 implements AbstractProductB{
@Override
public void test() {
System.out.println("ProductB1");
}
}
//
public class ProductA2 implements AbstractProductA {
@Override
public void test() {
System.out.println("productA2");
}
}
public class ProductB2 implements AbstractProductB{
@Override
public void test() {
System.out.println("ProductB2");
}
}
/**
* @ClassName:AbstractFactory
* @Description:抽象工厂接口
*/
public interface AbstractFactory {
//定义创建互相匹配的对象的接口
public AbstractProductA createAbstractProductA();
public AbstractProductB createAbstractProductB();
}
public class Factory1 implements AbstractFactory {
@Override
public AbstractProductA createAbstractProductA() {
return new ProductA1();
}
@Override
public AbstractProductB createAbstractProductB() {
return new ProductB1();
}
}
public class Factory2 implements AbstractFactory{
@Override
public AbstractProductA createAbstractProductA() {
return new ProductA2();
}
@Override
public AbstractProductB createAbstractProductB() {
return new ProductB2();
}
}
/**
* @ClassName:Client
* @Description:应用程序中的使用
*/
public class Client {
public static void main(String[] args) {
//创建工厂类对象
AbstractFactory fac=new Factory1();
//利用该工厂类对象创建出互相依赖的一组对象,对这些互相依赖的对象组合运用来实现一个功能
AbstractProductA a=fac.createAbstractProductA();
AbstractProductB b=fac.createAbstractProductB();
//相互依赖指的是两个对象之间有某些对应关系,就比如CPU与主板之间的针脚数必须对应
a.test();
b.test();
}
}
2. 理解抽象工厂模式
1. 与工厂方法模式的对比:抽象工厂模式与工厂方法模式基本相同,但最大的区别就是工厂方法模式不能建立起一组对象之间的依赖关系,而抽象工厂模式可以。
2. 功能:为某一系列相互依赖或者说相互匹配的对象的创建提供接口,通过同一个抽象工厂创建出来的不同类型的对象直接是相互依赖的。
3. 抽象工厂一般都是接口,而不是抽象类。
4. 抽象工厂模式的缺点:难以扩展,在上面的参考代码中,AbstractFactory 接口中只定义了两个创建AbstractProductA和AbstractProductB对象的接口,但如果想要再添加一个AbstractProductC对象的接口,那么就需要对其所有的实现子类都进行添加修改。从某种程度上来说,抽象工厂模式并不是完全满足开闭原则,如果是添加一个新的工厂是完全满足的,但如果需要修改工厂添加一个新的产品类创建方法时,所有的具体实现类都需要修改。
5. 使用情况:当应用程序需要一组互相依赖的对象的功能来组合使用,但又不需要知道其对象的功能具体实现时, 可以使用该模式。