抽象工厂模式
在工厂方法模式中具体工厂负责生产具体的产品, 每一个具体工厂对应一种具体产品但是有
时候我们希望一个工厂可以提供多个产品对象, 而不是单一的产品对象, 如一个电器工厂,
它可以生产电视机、 电冰箱、 空调等多种电器, 而不是只生产某一种电器。 为了更好地理解
抽象工厂模式, 我们先引入两个概念:
(1) 产品等级结构: 产品等级结构即产品的继承结构, 如一个抽象类是电视机, 其子类有海尔
电视机、 海信电视机、 TCL电视机, 则抽象电视机与具体品牌的电视机之间构成了一个产品等
级结构, 抽象电视机是父类, 而具体品牌的电视机是其子类。
(2) 产品族: 在抽象工厂模式中, 产品族是指由同一个工厂生产的, 位于不同产品等级结构中
的一组产品, 如海尔电器工厂生产的海尔电视机、 海尔电冰箱, 海尔电视机位于电视机产品
等级结构中, 海尔电冰箱位于电冰箱产品等级结构中, 海尔电视机、 海尔电冰箱构成了一个
产品族。
通过一个代码案例来学习下抽象工厂模式:
一:先用工厂方法模式实现下
1.1抽象产品
//抽象产品
public interface Button {
void display();
}
//抽象产品
public interface TextField {
void display();
}
1.2具体产品
//具体产品
public class SpringButton implements Button{
@Override
public void display() {
System.out.println("显示浅绿色按钮");
}
}
//具体产品
public class SummerButton implements Button{
@Override
public void display() {
System.out.println("显示浅蓝色按钮");
}
}
1.3抽象工厂
//抽象工厂: 是创建抽象产品的
public interface ButtonFactory {
Button createButton();
}
1.4具体工厂
//具体工厂: 在工厂方法模式下,具体只创建一种产品!
public class SpringButtonFactory implements ButtonFactory{
@Override
public Button createButton() {
return new SpringButton();
}
}
public class SummerButtonFactory implements ButtonFactory{
@Override
public Button createButton() {
return new SummerButton();
}
}
UML类图:
只写了Button一系列的,设想如果我突然想加ComboBox(组合框) 了,要么如果使用“工厂方法模式”,
要得像上面UML类图一样写 1(抽象产品) + 2(具体产品) + 1(抽象工厂) + 2(具体工厂) = 6,也就是说一旦要扩展的话
要写6个类,这是多么的麻烦,就只关于这点用工厂方法模式实现就可以说不是很好的实现方式!
二:使用抽象工厂模式
抽象工厂模式像是工厂方法模式的升级版
大致思想差不多:
抽象工厂模式 和 工厂方法模式比较:就是具体工厂不是创建一个具体产品,而是创建一个产品族的产品
工厂方法模式:
手机工厂 --》 只是生产手机的(包括小米,apple)
电脑工厂 --》 只是生产电脑的 (包括华硕,apple)
就是一个具体工厂生产一种产品
角色如下:
抽象产品
具体产品
抽象工厂
具体工厂:对应一种产品
抽象工厂模式:
电器工厂 --》 它会生产一系列的电器产品(产品族): 电脑,电视机,冰箱....
就是一个具体工厂生产一种产品族!
抽象产品
具体产品
抽象工厂:抽象工厂就是创建抽象产品的!
具体工厂:对应一种产品族
知道上面的概念后,我们使用“抽象工厂模式”对之前的代码重构
2.1抽象产品
//抽象产品
public interface Button {
void display();
}
2.2具体产品
//具体产品
public class SpringButton implements Button{
@Override
public void display() {
System.out.println("显示浅绿色按钮");
}
}
2.3抽象工厂
//抽象工厂: 在抽象工厂模式中,创建一种产品族
public interface SkinFactory {
Button createButton();
TextField createTextField();
}
2.4具体工厂
public class SpringSkinFactory implements SkinFactory{
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
}
2.5 测试代码
public class Client {
public static void main(String[] args) {
//抽象工厂
SkinFactory factory;
//抽象产品
Button button;
TextField field;
//具体工厂
factory = new SpringSkinFactory();
//具体产品
button = factory.createButton();
field = factory.createTextField();
button.display();
field.display();
}
}
UML类图:
如果使用工厂方法模式完成:会产生6个具体工厂
而使用抽象工厂模式完成:会产生2个具体工厂