一、介绍
很显然,简单工厂模式和工厂方法模式都只能生产一类的产品,除了生产手机,如果还需要生产手表,简单工厂模式和工厂方法模式就显得不是很优雅,只能复制代码了。因此就出现了抽象工厂模式,抽象工厂模式通过在抽象工厂中增加创建产品的接口,并在具体子工厂中实现新增产品的创建即可。
二、案例
这次采用模拟手机、智能手表制造举例说明:
- 手机制造标准
/**
* 手机制造标准
*
* @author zhangxs
**/
public interface Phone {
void make();
}
- 苹果手机具体制造实现
/**
* 苹果手机
*
* @author zhangxs
**/
public class ApplePhone implements Phone {
public ApplePhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造苹果手机...");
}
}
- 华为手机具体制造实现
/**
* 华为手机
*
* @author zhangxs
**/
public class HuaweiPhone implements Phone {
public HuaweiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造华为手机...");
}
}
- 小米手机具体制造实现
/**
* 小米手机
*
* @author zhangxs
**/
public class XiaomiPhone implements Phone {
public XiaomiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("已制造小米手机...");
}
}
- 智能手表制造标准
/**
* 智能手表制造标准
*
* @author zhangxs
**/
public interface Watch {
void make();
}
- 苹果智能手表具体制造实现
/**
* 苹果智能手表
*
* @author zhangxs
**/
public class AppleWatch implements Watch {
public AppleWatch() {
this.make();
}
@Override
public void make() {
System.out.println("已制造苹果智能手表...");
}
}
- 华为智能手表具体制造实现
/**
* 华为智能手表
*
* @author zhangxs
**/
public class HuaweiWatch implements Watch {
public HuaweiWatch() {
this.make();
}
@Override
public void make() {
System.out.println("已制造华为智能手表...");
}
}
- 小米智能手表具体制造实现
/**
* 小米智能手表
*
* @author zhangxs
**/
public class XiaomiWatch implements Watch {
public XiaomiWatch() {
this.make();
}
@Override
public void make() {
System.out.println("已制造小米智能手表...");
}
}
- 抽象工厂
/**
* 抽象工厂
*
* @author zhangxs
**/
public interface AbstractFactory {
Phone makePhone();
Watch makeWatch();
}
- 苹果产品制造工厂
/**
* 苹果产品代工厂
*
* @author zhangxs
**/
public class AppleFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new ApplePhone();
}
@Override
public Watch makeWatch() {
return new AppleWatch();
}
}
- 华为产品制造工厂
/**
* 华为产品代工厂
*
* @author zhangxs
**/
public class HuaweiFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new HuaweiPhone();
}
@Override
public Watch makeWatch() {
return new HuaweiWatch();
}
}
- 小米产品制造工厂
/**
* 小米产品代工厂
*
* @author zhangxs
**/
public class XiaomiFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new XiaomiPhone();
}
@Override
public Watch makeWatch() {
return new XiaomiWatch();
}
}
- 测试
/**
* 测试
*
* @author zhangxs
**/
public class Test {
public static void main(String[] args) {
AbstractFactory appleFactory = new AppleFactory();
appleFactory.makePhone();
appleFactory.makeWatch();
AbstractFactory huaweiFactory = new HuaweiFactory();
huaweiFactory.makePhone();
huaweiFactory.makeWatch();
AbstractFactory xiaomiFactory = new XiaomiFactory();
xiaomiFactory.makePhone();
xiaomiFactory.makeWatch();
}
}
三、总结
- 优点
1、抽象工厂模式包含了工厂方法模式的优点。
2、可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
3、当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
4、抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。 - 缺点
1、当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。 - 适用场景
1、系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
2、系统一次只可能消费其中某一族产品,即同族的产品一起使用。