设计模式-抽象工厂模式

###抽象工厂模式 抽象工厂模式类图

####抽象工厂模式优点:

  • 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

  • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

  • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

####抽象工厂模式缺点:

  • 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

####代码实现

//早餐工厂
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();
    }
}

运行结果:
**********第一天吃西餐***********
喝牛奶
吃面包
**********第一天吃中餐***********
喝豆浆
吃油条

####根据代码优缺点分析

优点

如果我们想是一个中西式的早餐,比如:喝牛奶吃油条,这个很容易实现,我们只需要一个实现早餐工厂的类,便可以创建牛奶喝油条。

缺点 如果我们又想添加一个饭后项目,比如西方饭前祷告,中方饭前祝酒,这样就得添加一个饭前的工厂,这样的话需要修改早餐工厂和其具体的实现类(西式早餐喝中式早餐)

转载于:https://my.oschina.net/u/2361475/blog/639346

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值