一、什么是抽象工厂模式?
抽象工厂模式提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。这样的描述我们会觉得和工厂模式比较像,那么工厂模式和抽象工厂模式的区别是什么呢?
这两种设计模式主要的区别在于产品,工厂模式是用来创建同一个产品的不同类型的(详情请看上一篇博客中卖包子的案例,大肉包和牛肉包它们都是包子的不同类型展示),但是抽象工厂模式是用来创建不同类的产品,比如包子店还卖豆浆油条。一般来说,产品种类单一,适合用工厂模式;如果有多个种类,各种类型时,通过抽象工厂模式来进行创建是很合适的。
那么举个早餐店的栗子来说明下:
最初的时候,由于规模小,只卖一种食物——包子,这个时候由于早餐店卖的食物种类简单,采用静态工厂模式即可,主要目的就是简单方便,如果想要卖奶黄包,那就在静态工厂里增加一个方法即可。
但是随着早餐店发展的越来越好,要多增加很多种包子的类型,这个时候使用静态工厂模式就不易于扩展了,那么采用工厂模式来管理,一个具体工厂负责一种具体的包子的创建,这个时候早餐店卖的只是同一种产品(包子)的不同类型(肉包,菜包,奶黄包……)。
来早餐店吃东西的人 ,客户们说你们不能只卖包子啊,我们还想喝豆浆。那么这个时候早餐店就在以前的包子种类上又增加了一个产品——豆浆,这个豆浆和包子不是同一个产品等级的,这个时候总不能在包子工厂里造豆浆吧?所以这时候采用抽象工厂的方式来解决。
二、抽象工厂模式框图
我们通过上述早餐店这个例子来讲述下抽象工厂模式在其中的应用,并请体会与工厂模式之间的区别
三、抽象工厂模式的具体代码
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
---------------------
作者:奥利弗的巨大泰迪
来源:CSDN
原文:https://blog.csdn.net/Olive_ZT/article/details/78861388
版权声明:本文为博主原创文章,转载请附上博文链接!