一、定义
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
二、解决的问题
如果想创建其他类型的产品,比如除了可以生产鼠标、还可以生产键盘、生产耳机等,就应该考虑采用抽象工厂模式。抽象工厂模式中还便于去创建其他的工厂再去生产这些具体“种类”的产品,比如可以增加一个华硕工厂还可以继续去生产鼠标、键盘和耳机。那么总是会有一个统一的工厂接口,去被继承实现,构造具体的工厂类。所以,个人理解:相比于工厂模式,抽象工厂模式丰富了产品的种类、工厂的种类。便于进行拓展实现。
三、设计类图
抽象工厂模式也就是不仅生产鼠标,同时生产键盘。也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口。戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。创建工厂时,由戴尔工厂创建。后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘。
四、代码实现
生产鼠标的接口:
public interface Mouse {
void sayHi();
}
不同工厂下的鼠标的实现类:
public class HaierMouse implements Mouse {
@Override
public void sayHi() {
System.out.println("Haier Mouse Say Hi");
}
}
public class HisenseMouse implements Mouse {
@Override
public void sayHi() {
System.out.println("Hisnese Mouse Say Hi.");
}
}
生产键盘的接口:
public interface KeyBo {
void sayHi();
}
不同工厂下的键盘的实现类:
public class HaierKeyBo implements KeyBo {
@Override
public void sayHi() {
System.out.println("Haier KeyBo.");
}
}
public class HisenseKeyBo implements KeyBo {
@Override
public void sayHi() {
System.out.println("Hisense Key Bo.");
}
}
抽象工厂去生产鼠标接口和键盘接口:
public abstract class PcFactory {
/**
* 创建鼠标
*
* @return
*/
public abstract Mouse createMouse();
/**
* 创建键盘
*
* @return
*/
public abstract KeyBo ceateKeyBo();
}
海尔工厂生产鼠标和键盘:
public class HaierFactory extends PcFactory{
@Override
public Mouse createMouse() {
return new HaierMouse();
}
@Override
public KeyBo ceateKeyBo() {
return new HaierKeyBo();
}
}
海信工厂生产鼠标和键盘:
public class HisenseFactory extends PcFactory {
@Override
public Mouse createMouse() {
return new HisenseMouse();
}
@Override
public KeyBo ceateKeyBo() {
return new HisenseKeyBo();
}
}
客户端的调用方式:
public class Main {
public static void main(String[] args) {
//由海尔工厂创建鼠标和键盘
PcFactory pcFactory = new HaierFactory();
pcFactory.createMouse().sayHi();
pcFactory.ceateKeyBo().sayHi();
//海信工厂创建鼠标和键盘
PcFactory pcFactory1 = new HisenseFactory();
pcFactory1.createMouse().sayHi();
pcFactory1.ceateKeyBo().sayHi();
}
}
五、增加工厂
假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。
六、增加产品
假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。