###抽象工厂模式
####抽象工厂模式优点:
-
抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
-
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
-
增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
####抽象工厂模式缺点:
- 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
####代码实现
//早餐工厂
public interface BreakfastFactory {
Food makeFood();
Drink makeDrink();
}
//饮料工厂
public interface Drink {
void drink();
}
//实现类
public class EastDrink implements Drink {
public void drink() {
System.out.println("喝豆浆");
}
}
public class WestDrink implements Drink {
public void drink() {
System.out.println("喝牛奶");
}
}
//主食工厂
public interface Food {
void eat();
}
//实现类
public class EastFood implements Food {
public void eat() {
System.out.println("吃油条");
}
}
public class WestFood implements Food {
public void eat() {
System.out.println("吃面包");
}
}
//早餐工厂实现类(中式早餐)
public class EastBreakfast implements BreakfastFactory {
public Food makeFood() {
return new EastFood();
}
public Drink makeDrink() {
return new EastDrink();
}
}
//西式早餐
public class WestBreakfast implements BreakfastFactory {
public Food makeFood() {
return new WestFood();
}
public Drink makeDrink() {
return new WestDrink();
}
}
public class Client {
public static void main(String[] args) {
System.out.println("**********第一天吃西餐***********");
BreakfastFactory breakfast = new WestBreakfast();
breakfast.makeDrink().drink();
breakfast.makeFood().eat();
System.out.println("**********第一天吃中餐***********");
breakfast = new EastBreakfast();
breakfast.makeDrink().drink();
breakfast.makeFood().eat();
}
}
运行结果:
**********第一天吃西餐***********
喝牛奶
吃面包
**********第一天吃中餐***********
喝豆浆
吃油条
####根据代码优缺点分析
优点
如果我们想是一个中西式的早餐,比如:喝牛奶吃油条,这个很容易实现,我们只需要一个实现早餐工厂的类,便可以创建牛奶喝油条。
缺点 如果我们又想添加一个饭后项目,比如西方饭前祷告,中方饭前祝酒,这样就得添加一个饭前的工厂,这样的话需要修改早餐工厂和其具体的实现类(西式早餐喝中式早餐)