抽象工厂模式是一个比较常用的设计模式,它的英文原话是:
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
意思是:为创建一组相关和相互依赖的对象提供一个接口,而且无须指定它们的具体类。
抽象工厂模式的UML图如下
涉及到4个对象:
抽象工厂角色,该角色是抽象工厂模式的核心,与应用系统无关。
具体工厂角色:需要实现抽象工厂接口,含有相应的对象选择逻辑,并接受应用调用以创建产品对象。
抽象产品角色:该角色定义某类产品的共性,是产品的抽象定义。
具体产品角色:实现抽象产品角色接口,抽象工厂模式锁创建的任何产品对象都是具体产品角色的一个实例。
抽象工厂模式的一个应用
现有手机和电脑两款产品,Apple公司生产iphone和MacBook,Samsung公司生产Galaxy和Samsung牌电脑。
现在需要手机和电脑一套装备,而且不希望出现混搭的情况,也就是说具体的手机产品和电脑产品是相互依赖的,如iphone配Mac,galaxy配Samsung
如果采用之前的工厂方法模式很容易出错(产生混搭的情况),抽象工厂模式则可以解决掉对象之间的这种约束关系。
用例的UML图形如下:
代码如下:
抽象产品接口Phone:
public interface Phone {
public void use();
}
抽象产品接口Computer
public interface Computer {
public void use();
}
具体产品角色IPhone
public class IPhone implements Phone {
@Override
public void use() {
System.out.println("This is a iphone");
}
}
具体产品角色MacBook
public class MacBook implements Computer{
@Override
public void use() {
System.out.println("This is a apple computer.");
}
}
具体产品角色Galaxy5
public class Galaxy5 implements Phone {
@Override
public void use() {
System.out.println("This is a samsung phone");
}
}
具体产品角色SamsungComputer
public class SamsungComputer implements Computer {
@Override
public void use() {
System.out.println("This is a samsung computer.");
}
}
核心抽象工厂角色AbstractFactory
public interface AbstractFactory {
public Phone createPhone();
public Computer createComputer();
}
具体工厂角色AppleFactory
public class AppleFactory implements AbstractFactory {
@Override
public Computer createComputer() {
return new MacBook();
}
@Override
public Phone createPhone() {
return new IPhone();
}
}
具体工厂角色SamsungFactory
public class SamsungFactory implements AbstractFactory {
@Override
public Computer createComputer() {
return new SamsungComputer();
}
@Override
public Phone createPhone() {
return new Galaxy5();
}
}
客户端调用测试类:
public class Client {
public static void main(String[] args) {
AbstractFactory af = new AppleFactory();
Phone iphone = af.createPhone();
Computer mac = af.createComputer();
iphone.use();
mac.use();
System.out.println("-----------------------");
AbstractFactory sf = new SamsungFactory();
Phone s5 = sf.createPhone();
Computer samsung = sf.createComputer();
s5.use();
samsung.use();
}
}
抽象工厂模式的优点
抽象工厂模式是工厂方法模式的进一步抽象,针对的是一族产品。如果产品中只有一种产品,则抽象工厂模式就退化成工厂方法模式。
除了工厂方法模式具有的优点外,抽象工厂模式还具有以下优点:
- 产品族内的约束是不可见的,在不同的工厂中,各种产品之间可能存在不同的依赖关系,这些依赖关系由工厂封装在工厂的内部,对工厂的使用者是不可见的;
- 产品线的扩展非常容易,如果针对同一产品族建立新的生产线(如再加入一个联想手机和电脑的生产线),只需要实现产品族中所有的接口并建立新的工厂类即可。
缺点:产品族本身的扩展比较困难,如果需要在产品族中增加一个新的产品类型(如果需要生产耳机产品),那么就需要修改多个接口,并且会影响到现有的工厂类。