|
2 | 2 |
|
3 | 3 | ## 用途 |
4 | 4 |
|
5 | | -> 工厂 ( Factory ) 和产品 ( Product ) 是 Abstract Factory 模式的主要参与者。 该模式描 |
6 | | - 述了怎样在不直接实例化类的情况下创建一系列相关的产品对象。 它最适用于产品对象的数 |
7 | | - 目和种类不变, 而具体产品系列之间存在不同的情况。 我们通过实例化一个特定的具体工厂 |
8 | | - 对象来选择产品系列, 并且以后一直使用该工厂生产产品对象。 我们也能够通过用一个不同 |
9 | | - 的具体工厂实例来替换原来的工厂对象以改变整个产品系列。 抽象工厂模式对产品系列的强 |
10 | | - 调使它区别于其他只与一种产品对象有关的创建性模式。 |
| 5 | +> 工厂 ( Factory ) 和产品 ( Product ) 是 Abstract Factory 模式的主要参与者。 该模式描述了怎样在不直接实例化类的情况下创建一系列相关的产品对象。 它最适用于产品对象的数目和种类不变, 而具体产品系列之间存在不同的情况。 我们通过实例化一个特定的具体工厂对象来选择产品系列, 并且以后一直使用该工厂生产产品对象。 我们也能够通过用一个不同的具体工厂实例来替换原来的工厂对象以改变整个产品系列。 抽象工厂模式对产品系列的强调使它区别于其他只与一种产品对象有关的创建性模式。 |
11 | 6 |
|
12 | 7 | ## 实例 |
13 | 8 |
|
14 | | -> |
| 9 | +> 假定一支远洋的队伍由船、船长以及水手组成,队伍有年轻和成熟之分。年轻的队伍有着年轻的船长、年轻的水手以及崭新的船只;而成熟的队伍有着老船长、老水手以及老旧的船只。不同队伍有着不同的主题,队伍中不同的物体存在一定的依赖性。 |
15 | 10 |
|
16 | 11 | ## 模式分析 |
17 | 12 |
|
| 13 | +> 首先定义队伍中几种组成部分的接口以及实现类 |
| 14 | +
|
| 15 | +``` |
| 16 | +public interface Member { |
| 17 | +
|
| 18 | + String getDescription(); |
| 19 | +} |
| 20 | +
|
| 21 | +public interface Captain extends Member { |
| 22 | +
|
| 23 | +} |
| 24 | +
|
| 25 | +public interface Sailor extends Member { |
| 26 | +
|
| 27 | +} |
| 28 | +
|
| 29 | +public interface Ship extends Member { |
| 30 | +
|
| 31 | +} |
| 32 | +``` |
| 33 | + |
| 34 | +> 接下来定义工厂的接口以及两种不同主题的实现类 |
| 35 | +
|
| 36 | +``` |
| 37 | +public interface TeamFactory { |
| 38 | +
|
| 39 | + Ship createShip(); |
| 40 | +
|
| 41 | + Captain createCaptain(); |
| 42 | +
|
| 43 | + Sailor createSailor(); |
| 44 | +} |
| 45 | +``` |
| 46 | +``` |
| 47 | +public class YoungTeamFactory implements TeamFactory { |
| 48 | +
|
| 49 | + public Ship createShip() { |
| 50 | + return new NewShip(); |
| 51 | + } |
| 52 | +
|
| 53 | + public Captain createCaptain() { |
| 54 | + return new YoungCaptain(); |
| 55 | + } |
| 56 | +
|
| 57 | + public Sailor createSailor() { |
| 58 | + return new YoungSailor(); |
| 59 | + } |
| 60 | +} |
| 61 | +``` |
| 62 | +``` |
| 63 | +public class PermanentTeamFactory implements TeamFactory { |
| 64 | +
|
| 65 | + public Ship createShip() { |
| 66 | + return new OldShip(); |
| 67 | + } |
| 68 | +
|
| 69 | + public Captain createCaptain() { |
| 70 | + return new OldCaptain(); |
| 71 | + } |
| 72 | +
|
| 73 | + public Sailor createSailor() { |
| 74 | + return new OldSailor(); |
| 75 | + } |
| 76 | +} |
| 77 | +``` |
| 78 | + |
| 79 | +> 现在,创建一个团队前则需要首先创建一个工厂对象,根据不同的主题创建不同的工厂 |
| 80 | +
|
| 81 | +``` |
| 82 | +TeamFactory factory = new YoungTeamFactory(); |
| 83 | +
|
| 84 | +Ship ship = factory.createShip(); |
| 85 | +Captain = factory.createCaptain(); |
| 86 | +Sailor = factory.createSailor(); |
| 87 | +
|
| 88 | +ship.getDescription(); // 崭新的船 |
| 89 | +captain.getDescription(); // 年轻的船长 |
| 90 | +sailor.getDescription(); // 年轻的水手 |
| 91 | +``` |
18 | 92 |
|
19 | 93 | ## 适用场景 |
0 commit comments