设计模式——抽象工厂模式及与工厂模式的区别

一、什么是抽象工厂模式?

 

抽象工厂模式提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。这样的描述我们会觉得和工厂模式比较像,那么工厂模式和抽象工厂模式的区别是什么呢?


这两种设计模式主要的区别在于产品,工厂模式是用来创建同一个产品的不同类型的(详情请看上一篇博客中卖包子的案例,大肉包和牛肉包它们都是包子的不同类型展示),但是抽象工厂模式是用来创建不同类的产品,比如包子店还卖豆浆油条。一般来说,产品种类单一,适合用工厂模式;如果有多个种类,各种类型时,通过抽象工厂模式来进行创建是很合适的


 那么举个早餐店的栗子来说明下:


最初的时候,由于规模小,只卖一种食物——包子,这个时候由于早餐店卖的食物种类简单,采用静态工厂模式即可,主要目的就是简单方便,如果想要卖奶黄包,那就在静态工厂里增加一个方法即可。


但是随着早餐店发展的越来越好,要多增加很多种包子的类型,这个时候使用静态工厂模式就不易于扩展了,那么采用工厂模式来管理,一个具体工厂负责一种具体的包子的创建,这个时候早餐店卖的只是同一种产品(包子)的不同类型(肉包,菜包,奶黄包……)。


来早餐店吃东西的人 ,客户们说你们不能只卖包子啊,我们还想喝豆浆。那么这个时候早餐店就在以前的包子种类上又增加了一个产品——豆浆,这个豆浆和包子不是同一个产品等级的,这个时候总不能在包子工厂里造豆浆吧?所以这时候采用抽象工厂的方式来解决。


二、抽象工厂模式框图


我们通过上述早餐店这个例子来讲述下抽象工厂模式在其中的应用,并请体会与工厂模式之间的区别


 

 

三、抽象工厂模式的具体代码

 

3.1 BreakfastFactory——抽象工厂接口,包含两个抽象方法,卖包子和卖豆浆

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 抽象工厂接口
 */
public interface BreakfastFactory {

    Breakfast sellBuns();
    Breakfast sellSoyMilk();
}

3.2 Breakfast——早餐接口,有一个卖早餐的抽象方法

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 抽象早餐接口
 */
public interface Breakfast {
    void sell();
}

3.3 BreakfastShop——早餐店类,实现了Breakfast接口,是所有早餐店的基类

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 所有早餐的基类
 */
public class BreakfastShop implements Breakfast{

    public void sell() {
        System.out.println("卖早餐了!!!");
    }
}

3.4 ExpensiveBuns——卖高级的包子,就像同济的甘其食,一个包子就要4、5块;继承至BreakfastShop类(同样还有ExpensiveSoyMilk类,甘其食高贵的豆浆)

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 高贵的包子
 */
public class ExpensiveBuns extends BreakfastShop{

    @Override
    public void sell() {
        System.out.println("这里的包子4块5起!");
    }
}

public class ExpensiveSoyMilk extends BreakfastShop{

    @Override
    public void sell() {
        System.out.println("这里的豆浆3块5起!");
    }
}

3.5 CheapBuns——卖便宜的包子;继承至BreakfastShop类(同样还有CheapSoyMilk类,便宜的豆浆)

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 便宜的包子
 */
public class CheapBuns extends BreakfastShop{

    @Override
    public void sell() {
        System.out.println("这里的包子统统1块5~");
    }
}

public class CheapSoyMilk extends BreakfastShop{

    @Override
    public void sell() {
        System.out.println("这里的豆浆只要1块5~");
    }
}

3.6 AdvBreakfastFactory——甘其食高级早餐工厂,制造高级包子和高级豆浆

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 甘其食高级早餐工厂
 */
public class AdvBreakfastFactory implements BreakfastFactory {

    public Breakfast sellBuns() {
        return new ExpensiveBuns();
    }

    public Breakfast sellSoyMilk() {
        return new ExpensiveSoyMilk();
    }
}

3.7 LowBreakfastFactory——低级早餐工厂,卖普通包子和豆浆

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 * 旺比低级早餐工厂
 */
public class LowBreakfastFactory implements BreakfastFactory {

    public Breakfast sellBuns() {
        return new CheapBuns();
    }

    public Breakfast sellSoyMilk() {
        return new CheapSoyMilk();
    }
}

3.8 Client,客户端

package designpatterns.abstractFactory;

/**
 * Created by Olive on 2017/12/20.
 */
public class Client {

    public static void main(String[] args){

        // 进入高级早餐店买一个包子
        BreakfastFactory breakfastFactory = new AdvBreakfastFactory();
        Breakfast breakfast = breakfastFactory.sellBuns();
        breakfast.sell();

        // 去低级早餐店买一包豆浆
        BreakfastFactory breakfastFactory2 = new LowBreakfastFactory();
        Breakfast breakfast2 = breakfastFactory2.sellSoyMilk();
        breakfast2.sell();
    }
}

3.8 结果

这里的包子4块5起!
这里的豆浆只要1块5~

Process finished with exit code 0

 

  • 12
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值