工厂模式
-wiki百科
工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
优点:
- 屏蔽了类的实现过程,用户只用关心类的接口。
- 拓展性高,需要增加新的实现只需要增加一个工厂类即可。
缺点:
- 代码变得复杂,类的依赖变得模糊。
例子: 买奶茶的时候,会选择大杯、中杯、小杯。
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
public interface CupSize {
void fillCup();
}
public class LargeCup implements CupSize {
@Override
public void fillCup() {
System.out.println("大杯");
}
}
public class MediumCup implements CupSize {
@Override
public void fillCup() {
System.out.println("中杯");
}
}
public class SmallCup implements CupSize {
@Override
public void fillCup() {
System.out.println("小杯");
}
}
public class CupSizeFactory {
public CupSize getCupSize(String cupName) {
if (cupName == null) {
return null;
}
if (cupName.equalsIgnoreCase("大杯")) {
return new LargeCup();
} else if (cupName.equalsIgnoreCase("中杯")) {
return new MediumCup();
} else if (cupName.equalsIgnoreCase("小杯")) {
return new SmallCup();
} else {
return null;
}
}
}
来杯大杯的奶茶。
1
2
3
CupSizeFactory mCupSizeFactory = new CupSizeFactory();
CupSize large = mCupSizeFactory.getCupSize("大杯");
large.fillCup();//大杯
抽象工厂模式
wiki百科
抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
例: 喝奶茶的时候不止要选择杯子的大小,有时候要调一下甜度,这个时候就可以使用抽象工厂来实现。
奶茶需要甜度及杯量。
1
2
3
4
5
6
7
public abstract class MilkTeaAbstractFactory {
abstract CupSize getCupSize(String cupName);
abstract Sweetness getSweetness(String sweetName);
}
再来两个工厂,一个用来确定甜度,一个用来确定杯量。
甜度:
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
public class SweetnessFactory extends MilkTeaAbstractFactory {
@Override
CupSize getCupSize(String cupName) {
return null;
}
@Override
public Sweetness getSweetness(String sweetName) {
if (sweetName == null) {
return null;
}
if (sweetName.equalsIgnoreCase("全糖")) {
return new FullSweet();
} else if (sweetName.equalsIgnoreCase("7分糖")) {
return new SeventySweet();
} else if (sweetName.equalsIgnoreCase("无糖")) {
return new NoneSweet();
} else {
return null;
}
}
}
public interface Sweetness {
void fillSugar();
}
public class FullSweet implements Sweetness {
@Override
public void fillSugar() {
System.out.println("全糖");
}
}
public class SeventySweet implements Sweetness {
@Override
public void fillSugar() {
System.out.println("七分糖");
}
}
public class NoneSweet implements Sweetness {
@Override
public void fillSugar() {
System.out.println("无糖");
}
}
杯量:
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
public class CupSizeFactory extends MilkTeaAbstractFactory {
@Override
public CupSize getCupSize(String cupName) {
if (cupName == null) {
return null;
}
if (cupName.equalsIgnoreCase("大杯")) {
return new LargeCup();
} else if (cupName.equalsIgnoreCase("中杯")) {
return new MediumCup();
} else if (cupName.equalsIgnoreCase("小杯")) {
return new SmallCup();
} else {
return null;
}
}
@Override
Sweetness getSweetness(String sweetName) {
return null;
}
}
public interface CupSize {
void fillCup();
}
public class LargeCup implements CupSize {
@Override
public void fillCup() {
System.out.println("大杯");
}
}
public class MediumCup implements CupSize {
@Override
public void fillCup() {
System.out.println("中杯");
}
}
public class SmallCup implements CupSize {
@Override
public void fillCup() {
System.out.println("小杯");
}
}
奶茶工厂:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MilkTeaFactory {
public static MilkTeaAbstractFactory getFactory(String factoryName) {
if (factoryName == null) {
return null;
}
if (factoryName.equalsIgnoreCase("cup")) {
return new CupSizeFactory();
} else if (factoryName.equalsIgnoreCase("sweetness")) {
return new SweetnessFactory();
} else {
return null;
}
}
}
来一杯全糖、大杯奶茶。
1
2
3
4
5
6
MilkTeaAbstractFactory mCupFactory = MilkTeaFactory.getFactory("cup");
MilkTeaAbstractFactory mSweetnessFactory = MilkTeaFactory.getFactory("sweetness");
CupSize mSize = mCupFactory.getCupSize("大杯");
Sweetness mSweet = mSweetnessFactory.getSweetness("全糖");
mSize.fillCup();
mSweet.fillSugar();