之前已经介绍了工厂方法设计模式的实现,以及优缺点,不了解的朋友可以看一下这篇文章。
工厂方法设计模式介绍
为了解决工厂方法模式会造成类膨胀的缺点,前辈们总结了抽象工厂设计模式,继续前面的例子,代码使用抽象工厂设计模式改造成下面这样。
public class AbstractFactory {
public static void main(String[] args) {
Factory factory=new KFCFactory();
Drink drink=factory.getDrink();
Food food=factory.getFood();
drink.drink();
food.eat();
}
}
interface Drink{
void drink();
}
class Cola implements Drink{
@Override
public void drink() {
System.out.println("可乐");
}
}
class Sprite implements Drink{
@Override
public void drink() {
System.out.println("雪碧");
}
}
interface Food{
void eat();
}
class Chicken implements Food{
@Override
public void eat() {
System.out.println("炸鸡");
}
}
class Hamberger implements Food{
@Override
public void eat() {
System.out.println("汉堡包");
}
}
interface Factory{
Food getFood();
Drink getDrink();
}
class KFCFactory implements Factory{
@Override
public Food getFood() {
return new Chicken();
}
@Override
public Drink getDrink() {
return new Cola();
}
}
class MCFactory implements Factory{
@Override
public Food getFood() {
return new Hamberger();
}
@Override
public Drink getDrink() {
return new Sprite();
}
}
抽象工厂设计模式的优点:
- 1.仍有简单工厂和工厂方法的优点。
- 2.无论用多少个产品登记,都只有一个工程,解决了工厂方法模式造成的类膨胀的问题。
可能有些人有这样的疑惑
- 1.为什么KFC工厂只能是可乐搭配炸鸡,不能可乐搭配汉堡? 解释:抽象工厂中可以生产多个产品,这多个产品中,必定存在联系。 一个工厂实现类中的产品属于同一个产品簇,不能把不同产品簇的产品放到同一个工厂实现类中去。可能这个吃喝的例子不能体现出来。举个例子,比如用螺丝和螺母举例子,6mm螺丝只能和6mm螺母在一起,属于同一个产品簇,8mm螺丝只能和8mm螺母在一起,属于同一个产品簇,6mm螺丝是不能和8mm不同产品簇的产品不能出现在同一个工厂实现类中。
抽象工厂的缺点
- 如果增加或删除产品等级,会修改抽象工厂的代码。比如新增加了一个产品等级Sweet甜品 ,就需要在抽象工厂中增加一个getSweet方法,这样做违反了开闭原则。
总结
- 产品等级比较固定时,使用抽象工厂设计模式。
- 当产品等级不稳定时,使用工厂方法设计模式。
最后,给代价看一下抽象工厂设计模式的UML类图