工厂方法模式和简单工厂模式的区别在于,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。

工厂方法模式是简单工厂模式的衍生,解决了很多简单工厂模式的问题。

首先完全实现“开-闭”原则,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

工厂方法模式(Factory Method Pattern)是最典型的模板方法模式(Template Method Pattern)应用

优点: 增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

缺点: 增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# coding:utf-8


class AbstractSchool(object):
name = ''
addr = ''
principal = ''

def enroll(self, name, course):
raise NotImplementedError

def info(self):
raise NotImplementedError


class AbstractCourse(object):
def __init__(self, name, time_range, study_type, fee):
self.name = name
self.time_range = time_range
self.study_type = study_type
self.fee = fee

def enroll_test(self):
"""
参加这门课程前需要进行的测试
:return
"""
print("课程[%s]测试中..." % self.name)

def print_course_outline(self):
"""
打印课程大纲
:return:
"""
pass


class LinuxOPSCourse(AbstractCourse):
"""Linux运维课程"""
def print_course_outline(self):
outline = """
Linux 基础
Linux 基本服务使用
Linux 高级服务篇
Linux Shell 编程
"""
print(outline)

def enroll_test(self):
print("不用测试,是个人就能学...")


class PythonCourse(AbstractCourse):
"""Python 自动化开发课程"""

def print_course_outline(self):
outline = """
Python 介绍
Python 基础语法
Python 函数式编程
Python 面向对象
Python 网络编程
Python Web 开发基础
"""
print(outline)

def enroll_test(self):
print("------ Python 入学测试 ------")
print("------ 500 道题答完了 ------")
print("------ 通过了 ------")

class BJSchool(AbstractSchool):
name = "老男孩北京校区"
def create_course(self, course_type):
if course_type == 'py_ops':
course = PythonCourse("Python 自动化开发", 7, "面授", 11000)
elif course_type == 'linux':
course = LinuxOPSCourse("Linux 运维课程", 5, "面授", 12800)
return course

def enroll(self, name, course):
print("开始为新学员[%s]办入学手续..." % name)
print("帮学员[%s]注册课程[%s]..." % (name, course.name))
course.enroll_test()

def info(self):
print("------ [%s] ------" % self.name)


class SHSchool(AbstractSchool):
name = "老男孩上海分校"
def create_course(self, course_type):
if course_type == 'py_ops':
course = PythonCourse("Python 自动化开发", 8, '在线', 6500)
elif course_type == 'linux':
course = LinuxOPSCourse('Linux 运维课程', 6, '在线', 8000)
return course

def enroll(self, name, course):
print("开始为新学员[%s]办入学手续..." % name)
print("帮学员[%s]注册课程[%s]..." % (name, course.name))
course.enroll_test()

def info(self):
print("------ [%s] ------" % self.name)


school1 = BJSchool()
school2 = SHSchool()

school1.info()
c1 = school1.create_course('py_ops')
school1.enroll('张三', c1)
school1.enroll('王五', c1)

school2.info()
c2 = school2.create_course('py_ops')
school2.enroll('李四', c2)