学习是件开心事

工厂模式

将一组相似产品的创建过程放到一个类里来提供,这个类的设计即为工厂模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

简单工厂模式

一个抽象的接口,多个抽象接口的实现类,一个工厂类用来实例化抽象的接口。

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
##一个抽象接口
public interface Phone {
void make();
}
##多个抽象接口的实现
public class Iphone implements Phone {
public Iphone() {
this.make();
}
@Override
public void make() {
System.out.println("开始生产Iphone");
}
}
class MiPhone implements Phone {
public MiPhone() {
this.make();
}
@Override
public void make() {
System.out.println("开始生产MiPhone");
}
}
##一个工厂类
public class PhoneFactory {
public Phone makePhone(String type) {
if (Iphone.class.getSimpleName().equals(type)) {
return new Iphone();
} else if (MiPhone.class.getSimpleName().equals(type)) {
return new MiPhone();
}
return null;
}
}

简单工厂的测试如下:

1
2
3
4
5
public static void main(String[] args) {
PhoneFactory phoneFactory = new PhoneFactory();
Phone phone = phoneFactory.makePhone("Iphone");
MiPhone miPhone = (MiPhone) phoneFactory.makePhone("MiPhone");
}

工厂方法模式

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
phone接口 Iphone类和MiPhone类不变,将PhoneFactory改造成多个工厂的模式
public interface AbstractFactory {
Phone makePhone();
}
public class MiPhoneFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new MiPhone();
}
}
public class IphoneFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new Iphone();
}
}

测试类如下:

1
2
3
4
5
6
public static void main(String[] args) {
AbstractFactory miFactory = new MiPhoneFactory();
AbstractFactory iphoneFactory = new IphoneFactory();
miFactory.makePhone();
iphoneFactory.makePhone();
}

抽象工厂模式

再工厂模式的基础上,如果需要另外生产一种产品,只需要在AbstractFactory的接口里新定义一个产品接口,然后在实现类里添加新实现即可,不需要额外重复的再重写一套工厂模式,这就是抽象工厂模式。

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
phone接口 Iphone类和MiPhone类不变 新增一套产品PC接口 Ipc类和MiPc类
AbstractFactory新定义接口makePC MiPhoneFactory和IphoneFactory都新增对应makerPC实现
public interface PC {
void make();
}
public class MiPc implements PC {
public MiPc() {
make();
}
@Override
public void make() {
System.out.println("开始生产MiPc");
}
}
class Ipc implements PC {
public Ipc() {
this.make();
}
@Override
public void make() {
System.out.println("开始生产Ipc");
}
}
public interface AbstractFactory {
Phone makePhone();
PC makePC();
}
public class MiPhoneFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new MiPhone();
}
@Override
public PC makePC() {
return new MiPc();
}
}
public class IphoneFactory implements AbstractFactory {
@Override
public Phone makePhone() {
return new Iphone();
}
@Override
public PC makePC() {
return new Ipc();
}
}

测试类及结果如下:

 public static void main(String[] args) {
        AbstractFactory miFactory = new MiPhoneFactory();
        AbstractFactory iphoneFactory = new IphoneFactory();
        miFactory.makePhone();
        iphoneFactory.makePhone();
        miFactory.makePC();
        iphoneFactory.makePC();
    }

开始生产MiPhone
开始生产Iphone
开始生产MiPc
开始生产Ipc