定义
对象的获取并不是直接 new class(),而是通过工厂来生产对象,我们使用的时候再去工厂里拿对象。
我们为什么要这么做?
示例一:
1 package com.gongchang;
2
3 interface Person
4 {
5 public void study();
6 public void hobby();
7 public void eat();
8 public void wear();
9 public void sleep();
10
11 }
12
13 class Kid implements Person // 或者是继承也可以
14 {
15
16 @Override
17 public void study()
18 {
19 System.out.println("小孩学加减乘除");
20
21 }
22
23 @Override
24 public void hobby()
25 {
26 System.out.println("小孩喜欢看动画片");
27
28 }
29
30 @Override
31 public void eat()
32 {
33 System.out.println("小孩喜欢吃糖");
34
35 }
36
37 @Override
38 public void wear()
39 {
40 System.out.println("小孩喜欢穿带卡通的衣服");
41
42 }
43
44 @Override
45 public void sleep()
46 {
47 System.out.println("小孩每天睡眠时间很长");
48
49 }
50
51 }
52
53 class Adult implements Person
54 {
55
56 @Override
57 public void study()
58 {
59 System.out.println("成年人学专业技能");
60
61 }
62
63 @Override
64 public void hobby()
65 {
66 System.out.println("成年人喜欢竞技运动");
67
68 }
69
70 @Override
71 public void eat()
72 {
73 System.out.println("成年人经常不吃早饭");
74
75 }
76
77 @Override
78 public void wear()
79 {
80 System.out.println("成年人喜欢穿名牌");
81
82 }
83
84 @Override
85 public void sleep()
86 {
87 System.out.println("成年人每天睡眠时间短");
88
89 }
90 }
91
92 public class Test
93 {
94 public static void main(String[] args)
95 {
96 Kid kid = new Kid();
97 kid.study();
98 kid.hobby();
99 kid.eat();
100 kid.wear();
101 kid.sleep();
102 }
103 }
如果在 Test 类里面我现在的需求不需要 new Kid() 了,我现在需要 new Adult(),但是我还是要实现这些功能(只不过不同对象的这些功能内容不一样而已)。那我们就得这样改:
示例二:
1 class Test
2 {
3 public static void main(String[] args)
4 {
5 Adult adult = new Adult(); // 对象重新创建,并且所有的方法的调用者也要变成 adult 对象
6 adult.study();
7 adult.hobby();
8 adult.eat();
9 adult.wear();
10 adult.sleep();
11 }
12 }
仔细一想,造成这个的原因就是我们的调用方和对象的创建操作耦合在一起了。换句话说,如果有一个第三方来创建对象,当我们需要什么对象的时候直接从里面取就可以了,这样不是很好吗?
示例三:
1 /**
2 * 工厂类:
3 */
4 class Factory
5 {
6 public Person getObject(String className) throws Exception
7 {
8 return (Person) Class.forName(className).newInstance();
9 }
10
此时调用方就可以这样写:
1 public class Test{
2 public static void main(String[] args) throws Exception
3 {
4 Person person = Factory.getObject("com.gongchang.Kid"); // 扩展的时候可以根据配置文件灵活获取(即使现在换成 Adult,只需要改一下配置文件)
5 person.study();
6 person.hobby();
7 person.eat();
8 person.wear();
9 person.sleep();
10 }
11 }
注意:简单工厂模式或者说工厂模式的关注点并不在于在工厂中是如何生产对象的,而在于将创建产品与消费产品分离(即:解耦合)。
简单工厂模式在Java中的应用
未完待续。。。。。
工厂模式的缺点
使用反射效率会低一些