抽象工厂模式可以说是在之前的简单工厂模式和工厂方法模式上的扩展版本,之前的简单工厂模式和工厂方法模式都是创建单一类型的对象,而抽象工厂模式则创建一系列相关联的对象。如果工厂方法模式中只包含一个抽象产品类,而抽象工厂模式可以包含多个抽象产品类。
抽象工厂模式主要增加了一个创建不同工厂的抽象接口AbstractFactory(抽象类或者接口实现),该接口可以称为超级工厂,在使用的过程中,通过继承或者实现抽象工厂创建出不同的工厂对象,然后根据不同的工厂对象创建不同的对象。
之前在写工厂方法模式使用了生产手机的例子,手机有华为和小米两种产品,只有一个抽象产品类Phone,这只是针对一个产品维度来进行分类,在有多个产品维度的时候则不太适用了,比如,华为除了生产手机还生产电脑,小米也是除了生产手机也还生产电脑,这样便有多个抽象产品类Phone、Computer,这样使用工厂方法模式便会出现多个独立的工厂,显然不适用这种情况,而这便需要使用抽象工厂模式来实现了。
以华为、小米两个厂商作为例子,华为除了生产手机也生产电脑,小米除了生产手机也生产电脑,UML图如下:
主要类有:
抽象工厂类:AbstractFacory
具体工厂类:MiFactory、HuaweiFactory
抽象产品类:Phone、Computer
具体产品类:MiPhone、HuaweiPhone、MiComputer、HuaweiComputer
实现代码如下:
1、定义抽象产品类Phone、Computer,接口Phone中定义一个打电话的方法call(),接口Computer定义一个上网的方法Internet()
package com.bran.factory.type3;
public interface Phone {
public String call();
}
package com.bran.factory.type3;
public interface Computer {
public String internet();
}
2、定义具体产品类,显然,华为和小米都生产手机电脑,所以手机有两种牌子分别为华为和小米,所以Phone有两种具体实现类分别为HuaweiPhone和MiPhone,同理电脑也有两种牌子分别为华为和小米,所以Computer有两种具体实现类分别为HuaweiComputer和MiComputer
package com.bran.factory.type3;
public class HuaweiPhone implements Phone{
@Override
public String call() {
return "使用华为手机打电话";
}
}
package com.bran.factory.type3;
public class MiPhone implements Phone{
@Override
public String call() {
return "使用小米手机打电话";
}
}
package com.bran.factory.type3;
public class HuaweiComputer implements Computer{
@Override
public String internet() {
return "使用华为电脑上网";
}
}
package com.bran.factory.type3;
public class MiComputer implements Computer{
@Override
public String internet() {
return "使用小米电脑上网";
}
}
3、定义抽象工厂类AbstractFactory,分别定义好要生产手机和电脑的方法,而具体生产什么类型的手机和电脑,交给具体工厂类去实现
package com.bran.factory.type3;
public abstract class AbstractFactory {
abstract protected Phone createPhone();
abstract protected Computer createComputer();
}
4、定义具体工厂类,可以把华为和小米分别看作是一个具体工厂,华为工厂只负责生产华为手机和华为电脑,小米工厂也只负责生产小米手机和小米电脑,所以具体工厂类为HuaweiFactory、MiFactory
package com.bran.factory.type3;
public class HuaweiFactory extends AbstractFactory{
@Override
protected Phone createPhone() {
return new HuaweiPhone();
}
@Override
protected Computer createComputer() {
return new HuaweiComputer();
}
}
package com.bran.factory.type3;
public class MiFactory extends AbstractFactory {
@Override
protected Phone createPhone() {
return new MiPhone();
}
@Override
protected Computer createComputer() {
return new MiComputer();
}
}
5、测试抽象工厂模式,需要生产产品的时候,定义一个抽象工厂类AbstractFactory,根据抽象工厂类AbstractFactory生产不同的工厂类HuaweiFactory、MiFactory,最终根据不同工厂生产不同的产品。
package com.bran.factory.type3;
public class FactoryTest {
public static void main(String[] args) {
AbstractFactory huaweiFactory = new HuaweiFactory();
AbstractFactory miFactory = new MiFactory();
Phone huaweiPhone = huaweiFactory.createPhone();
Phone miPhone = miFactory.createPhone();
Computer huaweiComputer = huaweiFactory.createComputer();
Computer miComputer = miFactory.createComputer();
System.out.println(huaweiPhone.call());
System.out.println(miPhone.call());
System.out.println(huaweiComputer.internet());
System.out.println(miComputer.internet());
}
}
实现工厂模式有三种不同的方式,有简单工厂模式、工厂方法模式和抽象工厂模式,这三种模式虽然在写法和使用当中会有一些差异,但还有有很多相似重叠的地方,工厂方法模式是对简单工厂模式的一种改进,当对简单工厂模式的工厂类进行抽象化后便是工厂方法模式了,而抽象工厂模式可以说是包含有工厂方法模式,工厂方法模式是抽象工厂模式的一种特例,如果抽象工厂模式应用于包含单个对象的簇,那么就得到了工厂方法模式。不管是哪种方式,工厂模式的核心都没有变,都是由工厂类来负责合适对象的创建。