一口一口啃完Java中的24种设计模式---简单工厂模式、工厂方法模式、抽象工厂方法模式


工厂模式总结

UML图

简单工厂模式 UML 图

工厂方法模式 UML 图

抽象工厂方法模式 UML 图

Demo

简单工厂模式 Demo

比较简单,此处略去。

工厂方法模式 Demo

Factory

需求: 系统运行日志记录器(Logger),该记录器可以通过多种途径保存系统的运行日志,如通过文件记录或数据库记录,用户可以灵活地更换日志记录方式。

1
2
3
4
5
6
7
8
/**
* @author: fanyuzeng on 2018/5/26 10:54
*/
public interface LoggerFactory {
//此处创建 Logger 方法可重载
Logger createLogger();
}

Product

1
2
3
4
5
6
7
/**
* @author: fanyuzeng on 2018/5/26 10:53
*/
public interface Logger {
void writeLog();
}

concreteFactory

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
/**
* @author: fanyuzeng on 2018/5/26 10:55
*/
public class DatabaseLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
//连接数据库,代码省略
//创建数据库日志记录器对象
Logger logger = new DatabaseLogger();
//初始化数据库日志记录器,代码省略
return logger;
}
}
/**
* @author: fanyuzeng on 2018/5/26 10:55
*/
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
//创建文件日志记录器对象
Logger logger = new FileLogger();
//创建文件,代码省略
return logger;
}
}

concreteProduct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @author: fanyuzeng on 2018/5/26 10:53
*/
public class FileLogger implements Logger {
@Override
public void writeLog() {
System.out.println("数据库日志记录。");
}
}
/**
* @author: fanyuzeng on 2018/5/26 10:53
*/
public class DatabaseLogger implements Logger {
@Override
public void writeLog() {
System.out.println("数据库日志记录。");
}
}

Test

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @author: fanyuzeng on 2018/5/26 10:58
*/
public class Test {
public static void main(String[] args) {
LoggerFactory factory;
Logger logger;
factory = new FileLoggerFactory(); //可引入配置文件实现
logger = factory.createLogger();
logger.writeLog();
}
}

抽象工厂方法模式 Demo

界面皮肤设计,用户在使用时可以通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,如下所示:

该皮肤库需要具备良好的灵活性和可扩展性,用户可以自由选择不同的皮肤,开发人员可以在不修改既有代码的基础上增加新的皮肤。

Factory

1
2
3
4
5
6
7
8
9
10
11
/**
* @author: fanyuzeng on 2018/5/26 11:33
*/
public interface SkinFactory {
Button createButton();
TextField createTextField();
ComboBox createComboBox();
}

Product

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @author: fanyuzeng on 2018/5/26 11:28
*/
public interface Button {
void display();
}
/**
* @author: fanyuzeng on 2018/5/26 11:29
*/
public interface ComboBox {
void display();
}
/**
* @author: fanyuzeng on 2018/5/26 11:29
*/
public interface TextField {
void display();
}

concreteproduct

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
/**
* @author: fanyuzeng on 2018/5/26 11:30
*/
public class SpringButton implements Button {
@Override
public void display() {
System.out.println("显示浅绿色按钮。");
}
}
/**
* @author: fanyuzeng on 2018/5/26 11:32
*/
public class SpringComboBox implements ComboBox {
@Override
public void display() {
System.out.println("显示绿色边框组合框。");
}
}
/**
* @author: fanyuzeng on 2018/5/26 11:31
*/
public class SpringTextField implements TextField {
@Override
public void display() {
System.out.println("显示绿色边框文本框。");
}
}
/**
* @author: fanyuzeng on 2018/5/26 11:30
*/
public class SummerButton implements Button {
@Override
public void display() {
System.out.println("显示浅蓝色按钮。");
}
}
/**
* @author: fanyuzeng on 2018/5/26 11:31
*/
public class SummerComnoBox implements ComboBox {
@Override
public void display() {
System.out.println("显示蓝色边框组合框。");
}
}
/**
* @author: fanyuzeng on 2018/5/26 11:31
*/
public class SummerTextField implements TextField {
@Override
public void display() {
System.out.println("显示蓝色边框文本框。");
}
}

concretefactory

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
/**
* @author: fanyuzeng on 2018/5/26 11:34
*/
public class SpringSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SpringButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
@Override
public ComboBox createComboBox() {
return new SpringComboBox();
}
}
/**
* @author: fanyuzeng on 2018/5/26 11:34
*/
public class SummerSkinFactory implements SkinFactory {
@Override
public Button createButton() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SummerTextField();
}
@Override
public ComboBox createComboBox() {
return new SummerComnoBox();
}
}

Test

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
/**
* @author: fanyuzeng on 2018/5/26 11:35
*/
public class Test {
public static void main(String[] args) {
SkinFactory factory1, factory2;
Button bt1, bt2;
TextField tf1, tf2;
ComboBox cb1, cb2;
//创建夏天风格皮肤
factory1 = new SummerSkinFactory();
bt1 = factory1.createButton();
tf1 = factory1.createTextField();
cb1 = factory1.createComboBox();
bt1.display();
tf1.display();
cb1.display();
//创建春天风格皮肤
factory2 = new SpringSkinFactory();
bt2 = factory2.createButton();
tf2 = factory2.createTextField();
cb2 = factory2.createComboBox();
bt2.display();
tf2.display();
cb2.display();
}
}
共82.3k字
0%
.gt-container a{border-bottom: none;}