楼子湾

导航

统计
 

1.抽象工厂模式介绍

  抽象工厂模式定义:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。是工厂方法的升级版

  为了更好的学习抽象工厂模式,我们先了解产品等级和产品族,相同的产品等级就是相同的产品,如:肯德基的汉堡包和麦当劳的汉堡包,虽然属于不同的餐饮店(工厂),但是属于同一等级的产品。而肯德基的汉堡包、肯德基的薯条 肯德基 炸鸡 肯德基的可乐都同属于一家店(工厂)的一系列相关产品。

  抽象工厂模式,它强调了一系列相关对象(统一产品族)的创建过程,而工厂方法模式侧重于同一等级产品的创建,抽象工厂侧重同一产品族创建。也就是说抽象工厂模式下,一个工厂中生产的一系列对象都属于同一个产品族。

2.demo

 还是以汉堡包 薯条 炸鸡为例

 创建三个接口:汉堡包 薯条 炸鸡

  

 1 public interface Chips {
 2     public void chipsInfo();
 3 }
 4 
 5 public interface FriedChicken {
 6     public void friedChickenInfo();
 7 }
 8 
 9 public interface Hamburger {
10     public void hambergerInfo();
11 }

创建具体的产品类:

 1 public class KFCChips implements Chips {
 2     @Override
 3     public void chipsInfo() {
 4         System.out.println("肯德基薯条");
 5     }
 6 }
 7 
 8 public class KFCFriedChicken implements FriedChicken {
 9     @Override
10     public void friedChickenInfo() {
11         System.out.println("肯德基炸鸡");
12     }
13 }
14 
15 public class KFCHamberger implements Hamburger {
16     @Override
17     public void hambergerInfo() {
18         System.out.println("肯德基汉堡");
19     }
20 }

类图如下:

 

 

 

 

 

抽象工厂:

1 public interface Factory {
2     public Chips createChips();
3     public FriedChicken createFriedChicken();
4     public Hamburger createHamburger();
5 }

创建具体的工厂类

 1 public class KFCFactory implements Factory {
 2     @Override
 3     public Chips createChips() {
 4         return new KFCChips();
 5     }
 6 
 7     @Override
 8     public FriedChicken createFriedChicken() {
 9         return new KFCFriedChicken();
10     }
11 
12     @Override
13     public Hamburger createHamburger() {
14         return new KFCHamberger();
15     }
16 }

在这个工厂里面生产的所有产品对象都不是一个产品等级,它属于同一个产品族,该工厂生产的一系列对象都是相关的。就像定义说的:抽象工厂模式提供一个创建一系列相关或者互相依赖对向的接口。

如果我们还希望创建麦当劳一系列产品,就可以扩展抽象接口创建一系列麦当劳产品类,创建麦当劳工厂生产麦当劳一系列产品

 

创建抽象的服务员以及具体的服务员:

 1 public abstract class Waiter {
 2     private Factory factory;
 3     public abstract void order();
 4 
 5     public Waiter(Factory factory) {
 6         this.factory = factory;
 7     }
 8 
 9     protected Factory getFactory() {
10         return factory;
11     }
12 
13     protected void setFactory(Factory factory) {
14         this.factory = factory;
15     }
16 }
17 
18 public class KFCWaiter extends Waiter {
19     public KFCWaiter(Factory factory) {
20         super(factory);
21     }
22 
23     @Override
24     public void order() {
25         Chips chips = getFactory().createChips();
26         chips.chipsInfo();
27         FriedChicken friedChicken = getFactory().createFriedChicken();
28         friedChicken.friedChickenInfo();
29         Hamburger hamburger = getFactory().createHamburger();
30         hamburger.hambergerInfo();
31     }
32 }

测试:

1 public class Test {
2     public static void main(String[] args) {
3         Factory kfcFactory = new KFCFactory();
4         Waiter waiter = new KFCWaiter(kfcFactory);
5         waiter.order();
6     }
7 }

结果:

 

posted on 2020-03-09 21:49  楼子湾  阅读(...)  评论(...编辑  收藏