1. 模式简介
提供一个创建一系列相关或者相互依赖对象的接口,无须指定具体的类,属于创建型设计模式
。
2. 示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public abstract class Phone {
public abstract void describe(); }
public abstract class Laptop {
public abstract void describe(); }
public abstract class EarPhone {
public abstract void describe(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public abstract class TechFactory {
public abstract Phone sellPhone();
public abstract Laptop sellLaptop();
public abstract EarPhone sellEarPhone(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
public class MiPhone extends Phone {
@Override public void describe() { System.out.println("小米手机"); } }
public class MiLaptop extends Laptop{
@Override public void describe() { System.out.println("小米笔记本"); } }
public class MiEarPhone extends EarPhone {
@Override public void describe() { System.out.println("小米耳机"); } }
public class MiTechCompany extends TechFactory {
@Override public Phone sellPhone() { return new MiPhone(); }
@Override public Laptop sellLaptop() { return new MiLaptop(); }
@Override public EarPhone sellEarPhone() { return new MiEarPhone(); } }
public class HuaweiPhone extends Phone {
@Override public void describe() { System.out.println("华为手机"); } }
public class HuaweiLaptop extends Laptop{
@Override public void describe() { System.out.println("华为笔记本"); } }
public class HuaweiEarPhone extends EarPhone {
@Override public void describe() { System.out.println("华为耳机"); } }
public class HuaweiTechCompany extends TechFactory {
@Override public Phone sellPhone() { return new HuaweiPhone(); }
@Override public Laptop sellLaptop() { return new HuaweiLaptop(); }
@Override public EarPhone sellEarPhone() { return new HuaweiEarPhone(); } }
public class IPhone extends Phone {
@Override public void describe() { System.out.println("IPhone"); } }
public class MacBookPro extends Laptop{
@Override public void describe() { System.out.println("MacBookPro"); } }
public class AirPod extends EarPhone {
@Override public void describe() { System.out.println("AirPod"); } }
public class AppleTechCompany extends TechFactory {
@Override public Phone sellPhone() { return new IPhone(); }
@Override public Laptop sellLaptop() { return new MacBookPro(); }
@Override public EarPhone sellEarPhone() { return new AirPod(); } }
|
3. UML图例

4. 应用
5. 场景
- 客户端不依赖产品类,不关注创建、实现的细节
- 强调一系列产品对象(产品族),一起创建时需要大量创建代码
- 提供一类产品的库,所有的产品以同样的接口出现,从而使客户端不依赖具体实现
6. 优缺点
优点: 具体产品在应用层代码隔离,不关心创建细节;将一系列的产品族对象统一在一起创建
缺点: 添加一种新的产品的时候,需要在工厂接口及其工厂子类都添加实现,不符合开闭原则;增加了系统的抽象性和理解难度
7. 完整代码地址
https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/creational/abstractfactory