华为全家桶、苹果全家桶
<!-- more -->
工厂模式(factory Method)的本质是什么?为什么引入工厂模式?- 大宽宽的回答 - 知乎
https://www.zhihu.com/question/42975862/answer/1239305317
## 关键词
我来整理一下工厂模式相关的关键词和概念:
| 分类 | 关键词 | 说明 |
| ---- | ---------------- | --------------- |
| 工厂类型 | Simple Factory | 简单工厂,单个工厂类创建对象 |
| | Factory Method | 工厂方法,定义创建对象的接口 |
| | Abstract Factory | 抽象工厂,创建一组相关对象 |
| | Static Factory | 静态工厂,使用静态方法创建对象 |
| | Dynamic Factory | 动态工厂,运行时决定创建的对象 |
| 核心角色 | Creator | 创建者,声明工厂方法的接口 |
| | ConcreteCreator | 具体创建者,实现工厂方法 |
| | Product | 产品,工厂创建的对象接口 |
| | ConcreteProduct | 具体产品,实际被创建的对象 |
| | Factory | 工厂类,负责创建对象的类 |
| 相关方法 | CreateInstance | 创建实例的方法 |
| | GetInstance | 获取实例的方法 |
| | NewInstance | 新建实例的方法 |
| | Register | 注册可创建的产品类型 |
| | Build | 构建对象的方法 |
您对工厂模式中的哪些具体实现或应用场景比较感兴趣?我可以详细解释其中的任何概念。
## 场景
1. 要 new 出一个对象,需要经历好多步骤,不封装的话得写一大坨代码
```java
public class RedisFactory {
private static final Logger LOGGER = LoggerFactory.getLogger(RedisFactory.class);
public static RedisAsyncClient create(String namespace, String cipher) {
LOGGER.info("begin to init redis client, ns={}", namespace);
RedisConfig.Builder configBuilder = RedisConfig
.newBuilder();
configBuilder.withCodec(new CommonRedisCoder());
configBuilder.withDiscardPolicy(RedisConfig.DiscardPolicy.RETRY_ON_RECONNECTED); // 连接是异步的, 在连上之前cmd可以入队列
configBuilder.withStartupRetryTimes(3);
configBuilder.withReconnectCmdQueueSize(50000);
RedisClientBuilder builder = RedisClientBuilder.create(namespace, cipher);
builder.setSessionConfig(configBuilder.build());
try {
return builder.buildAsync();
} catch (RedisException e) {
throw Throwables.propagate(e);
}
}
}
```

1. 有一批类似的类需要实例化,所谓的类似的类,又分一✖️n 和 n✖️n 两种情况
## 简单工厂和抽象工厂的区别
本质的区别是类的复杂程度:
如果是普通的 1-n 的树状结构,比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。普通的工厂方法模式只把产品抽象了(人 - 男人、女人),工厂是具体的,要男人造男人,要女人造女人。
如果是存在两个维度的表格或者矩阵型结构,也就是所谓的多产品族,即由同一个工厂生产的,位于不同产品等级结构中的一组产品,比如苹果全家桶。在抽象工厂中,产品是抽象的(电子设备 - 平板、电脑),工厂也是抽象的(电子设备厂 - 华为、苹果)