设计模式第一弹,简单工厂模式

"设计模式"

Posted by hbl on 2017-03-22

设计模式第一弹,简单工厂模式

最近在补一些基础知识,设计模式啊,算法啊,数据结构之类的,觉得自己还差的好多,第一个副本就是设计模式,学习的文章是http://blog.csdn.net/lovelion/article/details/17517213史上最全的设计模式,朋友推荐的,这一系列的内容也就是写读书心得,毕竟看过一遍没有自己再梳理一遍来的深刻。
先简单说一下主要内容;包含三部分,简单工厂模式,工厂方法模式和抽象工厂模式。

简单工厂模式

简介:工厂模式是最常用的一种创建型设计模式,通常所说的工厂模式都是指工厂方法模式,简单工厂模式就是工厂方法模式的小弟。不是GoF23中设计模式中的一种,属于入门级设计模式,也是最简单的工厂模式。
设计思想:首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类成为具体的产品类,而将他们公共的代码进行抽象和提取后封装到一个抽象产品类中,每一个具体的产品类都是抽象产品的子类,然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的方法, 该方法可以根据传递的参数不同来创建不同的具体产品对象,客户端只需要调用工厂类的工厂方法并传入相应的参数就可以得到一个产品对象。
简单工厂模式:定义一个工厂类,他根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类,因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式。
练习实战:使用简单工厂模式设计一个可以创建不同几何形状(圆形,方形,三角形)的绘图工具,每个几何图形都具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public interface Tool {
void draw();
void erace();
}
class RoundTool implements Tool {
@Override
public void draw() {
System.out.println("绘制一个圆形");
}
@Override
public void erace() {
System.out.println("擦除一个圆形");
}
}
class SquareTool implements Tool {
@Override
public void draw() {
System.out.println("绘制一个方形");
}
@Override
public void erace() {
System.out.println("擦除一个方形");
}
}
class TriangeTool implements Tool {
@Override
public void draw() {
System.out.println("绘制一个三角形");
}
@Override
public void erace() {
System.out.println("擦除一个三角形");
}
}
public class DrawToolFactory {
public static Tool getDrawTool(String type){
Tool tool=null;
if(type.equalsIgnoreCase("round")){
tool=new RoundTool();
System.out.println("初始化圆形工具!");
}else if(type.equalsIgnoreCase("square")){
tool=new SquareTool();
System.out.println("初始化方形工具!");
}else if(type.equalsIgnoreCase("triange")){
tool=new TriangeTool();
System.out.println("初始化三角形工具!");
}else{
throw new UnsupportedClassVersionError("不支持的类型");
}
return tool;
}
}
/**
* 解析器
*/
public class XMLUtil {
public static String getDrawTool() {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("config.xml"));
NodeList nl=doc.getElementsByTagName("drawType");
Node classNode=nl.item(0).getFirstChild();
String drawType=classNode.getNodeValue().trim();
return drawType;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
/**
* xml
*/
<?xml version="1.0"?>
<config>
<drawType>triange</drawType>
</config>
/**
* 运行类
*/
public static void main(String[]args){
Tool round= DrawToolFactory.getDrawTool("round");
round.draw();
round.erace();
Tool square= DrawToolFactory.getDrawTool("square");
square.draw();
square.erace();
Tool triange=DrawToolFactory.getDrawTool(XMLUtil.getDrawTool());
triange.draw();
Tool tool=DrawToolFactory.getDrawTool("error");
}

简单的练习题写完了,都是写基础的应用,看下运行结果:

明天继续写下一篇 Fighting!!!Fighting!!!Fighting!!!