简单工厂模式
YeBin 2017-12-15 tag1
# 定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类 的实例化延迟到其子类 。也就是说把对象的创建交给工厂,不需要手动去new 出对象。
# 结构

三要素:
- 工厂类:定义了创建对象的行为。
- 抽象产品类:工厂创建对象的父类,为工厂创建所有对象提供一个公共的接口
- 具体产品类:抽象产品的子类,工厂所创建的目标
# 简单工厂的实现:
这里我以手机为例,手机有苹果手机,三星手机,华为手机,我们可已使用工厂来创建这三种手机
- 创建抽象产品类:
public abstract class Phone {
protected String model;
public Phone(String model) {
this.model = model;
}
public abstract void getInfo();
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 创建具体产品类:
//苹果手机
public class IPhone extends Phone{
public IPhone(String model) {
super(model);
}
@Override
public void getInfo() {
System.out.println("这是一部"+model+"手机");
}
}
//华为手机
public class Huawei extends Phone {
public Huawei(String model) {
super(model);
}
@Override
public void getInfo() {
System.out.println("这是一部"+model+"手机");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- 创建工厂类:
ublic class PhoneFactory {
private static Phone phone=null;
/***
* @Description TODO 工厂方法,生产给定model的手机
* @param [model]
* @return FactoryMode.SimpleFactoryMode.Phone
* @author 98262
*/
public static Phone getPhone(String model)
{
switch (model)
{
case "IPhone":phone=new IPhone(model);break;
case "Huawei":phone=new Huawei(model);break;
//其他产品无法生产
default:throw new IllegalArgumentException("不能生产该型号的手机 model="+model);
}
return phone;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- 测试:
public class test {
public static void main(String[] args) {
Phone iPhone=PhoneFactory.getPhone("IPhone");
iPhone.getInfo();
Phone huawei=PhoneFactory.getPhone("Huawei");
huawei.getInfo();
Phone sumsung=PhoneFactory.getPhone("SumSumg");
sumsung.getInfo();
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10

# 优缺点:
优点:工厂中集成了创建产品的逻辑,用于不需要直接创建产品,用户只需要给出需要的参数即可,怎么去创建对象对用户是透明的。
缺点:由于工厂中集成了创建产品的逻辑,一旦出现问题,导致整个系统出现问题。另外,一旦添加新的产品,就要修改工厂的逻辑,这违反了开闭原则,当产品太多时,导致工厂类太过臃肿,维护困难。
# 适用场景:
工厂类负责创建的对象很少且逻辑不是很复杂