1.简单工厂模式一:
大部分工厂类都是以"Factory"结尾,也不是必须,一般会结合语义场景来定义命名。有create开头的,有getInstance()、createInstance()、newInstance()的命名方式。以下代码根据实际情况我们可知,节省内存和创建的过程,我们可以在程序启动时候提前加载好并缓存起来,使用的时候直接拿来使用。
记忆区分:简单工厂模式,根据特定的特征,生产固定的对象模型
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
|
type RuleConfigSource struct {
}
func (r RuleConfigSource) Load(ruleConfigFilePath string) RuleConfig {
var ruleConfigFileExtension string = getFileExtension(ruleConfigFilePath)
var parser IRuleConfigParser = RuleConfigParserFactory.createParser(ruleConfigFileExtension)
if parser == nil {
errors.New("Rule config file format is not supported: " + ruleConfigFilePath)
}
var configText string = ""
var ruleConfig RuleConfig = parser.Parser(configText)
return ruleConfig
}
func getFileExtension(filePath string) string {
return "json"
}
type RuleConfigParserFactory struct {
}
func createParser(configFormat string) IRuleConfigParser {
var parser IRuleConfigParser
if strings.Contains(configFormat, "json") {
parser = JsonRuleConfigParser{}
} else if strings.Contains(configFormat, "xml") {
parser = XmlRuleConfigParser{}
} else if strings.Contains(configFormat, "yaml") {
parser = YamlRuleConfigParser{}
} else if strings.Contains(configFormat, "properties") {
parser = PropertiesRuleConfigParser{}
}
return parser
}
|
2.工厂方法模式
工厂方法的定义,从某方面来说是为了统一工厂类的动作。也是为了解耦上次代码的耦合
工厂方法模式相对简单工厂模式更加符合开闭原则
1
2
3
4
5
6
7
8
9
10
11
12
|
type IRuleConfigParserFactory interface{
CreateParser() IRuleConfigParser
}
var _ IRuleConfigParserFactory =
// 这里只写json的,可以通过实现IRuleConfigParserFactory接口来拓展:xml,propertiy,yaml
type JsonRuleConfigParserFactory struct{}
func (j *JsonRuleConfigParserFactory)CreateParser()IRuleConfigParser{
return JsonRuleConfigParser{}
}
|
通过变换之后,我们发现,要想在RuleConfigSource类中load方法引入工厂方法模式来创建parser,并调用load方法会导致在load方法中耦合了IRuleConfigParserFactory相关的创建和调用过程。针对这个问题,我们该怎么解决规避达到这块的代码逻辑”清晰明了“。
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
|
// 改造前
func Load(ruleConfigFilePath string) (RuleConfig,error){
ruleConfigExtension:=getFileExtension(ruleConfigFilePath)
var parserFactory IRuleConfigParserFactory
if (strings.Contains(ruleConfigFileExtension,"json")){
parserFactory = &JsonRuleConfigParser{}
}else if (strings.Contains(ruleConfigParser,"xml")){
parserFactory = &XmlRuleConfigParser{}
}else if (strings.Contains(ruleConfigParser,"yaml")){
parserFactory = &YamlRuleConfigParser{}
}else if (strings.Contains(ruleConfigParser,"properties")){
parserFactory = &PropertiesRuleConfigParser{}
}else{
return nil,errors.New("rule config file is not support! check it")
}
var parser IRuleConfigParser = parserFactory.CreateParser()
configText := ""
var ruleConfig RuleConfig = parser.Parser(configText)
return ruleConfig,nil
}
// 改造后
func Load(ruleConfigFilePath string) (RuleConfig,error){
ruleConfigExtension:=getFileExtension(ruleConfigFilePath)
var parserFactory IRuleConfigParserFactory = RuleConfigParserFactoryMap.GetParser(ruleConfigExtension)
if parserFactory == nil{
return nil,errors.New("rule config file is not support! please check it ")
}
var parser IRuleConfigParser = parserFactory.CreateParser()
configText := ""
var ruleConfig RuleConfig = parser.Parser(configText)
return ruleConfig,nil
}
type RuleConfigParserFactoryMap struct{
}
var CachedFactorys map[string]IRuleConfigParserFactory
func init(){
CachedFactorys["json"]=&JsonRuleConfigParserFactory{}
CachedFactorys["xml"]=&XmlRuleConfigParserFactory{}
CachedFactorys["yaml"]=&YamlRuleConfigParserFactory{}
CachedFactorys["properties"]=&PropertiesRuleConfigParserFactory{}
}
func GetParserFactory(type string)IRuleConfigParserFactory{
if type == ""{
return nil
}
parserFactory,ok:=CachedFactorys[type]
if !ok {
return nil
}
return parserFactory
}
|
3.抽象工厂(Abstract Factory)
简单工厂、工厂方法,类只有一种分类方式。而抽象工厂中,类就可以多种分类方式,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
type IConfigParserFactory interface{
CreateRuleParser() IRuleConfigParser
CreateSystemRuleParser() ISystemConfigParser
//还可以拓展其他的解析方式
}
type JsonConfigParserFactory struct{}
func (j JsonConfigParserFactory) CreateRuleParser() IRuleConfigParser{
return &JsonRuleConfigParser{}
}
func (j JsonConfigParserFactory)CreateSystemRuleParser() ISystemConfigParser{
return &JsonSystemRuleConfigParser{}
}
// ....省略其他对象的实现
|