抽象工厂模式
- 适用:多产品等级。工厂方法适用单一产品等级。
1. 实例
// 服务端
// 抽象产品
interface Food{
public void eat();
}
interface Drink{
public void drink();
}
// 具体产品
class hanbao implements Food{
@Override
public void eat(){
System.out.println("吃汉堡");
}
}
class mixian implements Food{
@Override
public void eat(){
System.out.println("吃米线");
}
}
class cola implements Drink{
@Override
public void drink() {
System.out.println("喝可乐");
}
}
class IcePeak implements Drink{
@Override
public void drink() {
System.out.println("喝冰峰");
}
}
// 抽象工厂
// 工厂接口
interface Factory{
// interface 只能有抽象方法
public Food getFood();
public Drink getDrink();
}
// 工厂实现
class KFCFactory implements Factory{
@Override
public Food getFood(){
return new hanbao();
}
@Override
public Drink getDrink() {
return new cola();
}
}
class SXFactory implements Factory{ //沙县
@Override
public Food getFood(){
return new mixian();
}
@Override
public Drink getDrink() {
return new IcePeak();
}
}
// 业务
class Business{
public static void taste(Factory factory){
Food f1 = factory.getFood();
Drink d1 = factory.getDrink();
System.out.println("评委1 品尝");
f1.eat();
d1.drink();
Food f2 = factory.getFood();
Drink d2 = factory.getDrink();
System.out.println("评委2 品尝");
f1.eat();
d1.drink();
Food f3 = factory.getFood();
Drink d3 = factory.getDrink();
System.out.println("评委3 品尝");
f1.eat();
d1.drink();
}
}
// ====================================================================
// 客户端
// 扩展功能
// --------------
class rice implements Food{
@Override
public void eat() {
System.out.println("吃米饭");
}
}
class water implements Drink{
@Override
public void drink() {
System.out.println("喝白开水");
}
}
class MCFactory implements Factory{
@Override
public Food getFood() {
return new rice();
}
@Override
public Drink getDrink() {
return new water();
}
}
// Test
public class HelloWorld {
public static void main(String[] args) {
Business.taste(new MCFactory());
}
}
2. UML
3. 优缺点
-
优点:具有简单工厂和工厂方法的优点;无论多少产品等级,只用一套工厂类即可。(如果只想获取一个Food或者Drink,那就直接new FKCFactory(),然后调用getFood即可,不使用业务传参数。)
-
杠点:
- 问题1:
- 问:为什么KFC中只能汉堡+可乐呢?return new water()不行吗?
- 答:抽象工厂中,可以生产多个产品,但是他们必须有内在联系(产品簇)。
- 如下6mm工厂只能生产6mm螺丝和螺母,不能一个6mm螺丝,一个8mm螺母。
- 问题1:
-
缺点:
-
多个产品簇源代码不需要修改,直接增加一个工厂(京东)即可。但是如果产品等级变化时(增加或者减少),那就必须改源代码,因为每个工厂都需要改变产品。
4. 总结
- 产品等级固定时,可考虑抽象工厂。