提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类。
类型:
创建型模式
适用场景:
产品族
优点:
将一系列的产品族一起创建
缺点
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口,同时增加系统抽象与理解难度。
抽象工厂与工厂方法的不同在于,抽象工厂关心产品族,工厂方法关心产品等级。
代码实现
改进工厂方法模式
《设计模式》之工厂方法模式
在上一次的工厂方法中已经创建了手机产品的huawei工厂与iphone工厂。
我们只需要增加产品族即可
引入《设计模式》之工厂方法模式 中的Phone接口与具体实现
Phone.java 为所有生产手机的类提供了一种约束
public class HuaweiPhone implements Phone {
@Override public void produce() {
System.out.println("生产华为手机");
}
}
HuaweiPhone.java 华为生产手机的具体实现
public class HuaweiPhone implements Phone {
@Override public void produce() {
System.out.println("生产华为手机");
}
}
Iphone.java 苹果生产产品的具体实现
public class Iphone implements Phone {
@Override public void produce() {
System.out.println("produce iphone");
}
}
华为与苹果不止生产手机,还生产智能手表与蓝牙耳机(抽象工厂的产品族指的就是本文中华为或苹果这个品牌)。
创建智能手表的相关实现
watch.java 接口,对所有智能手表产品进行约束
public interface Watch {
void produce()
;}
HuaweiWatch.java 华为手表具体实现
public class HuaweiWatch implements Watch{
@Override
public void produce() {
System.out.println("produce huawei watch");
}
}
AppleWatch.java 苹果手表具体实现
public class AppleWatch implements Watch{
@Override
public void produce() {
System.out.println("produce apple watch");
}
}
创建生产产品的工厂
SmartDevice.java 对所有工厂进行约束
public interface SmartDevice {
public Phone makePhone();
public Watch makeWatch();
}
HuaweiFactory.java 华为工厂
public class HuaweiFactory implements SmartDevice{
@Override public Phone makePhone() {
return new HuaweiPhone(); }
@Override public Watch makeWatch() {
return new HuaweiWatch(); }
}
AppleFactory.java苹果工厂
public class AppleFactory implements SmartDevice{
@Override public Phone makePhone() {
return new Iphone(); }
@Override public Watch makeWatch() {
return new AppleWatch(); }
}
Client.java 客户端调用
public class Client {
public static void main(String[] args) {
SmartDevice smartDevice=new AppleFactory();
smartDevice.makePhone().produce();
smartDevice.makeWatch().produce();
}
}
UML类图