1.概念

工厂模式(factory pattern)提供了一种创建对象的最佳方式

在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,也就是说,通过创建对象的接口, 让子类自己决定实例化哪个工厂类,工厂模式使其创建过程延迟到子类。

工厂模式解决了接口选择的问题

  • 优点:
    • 调用者如果想要创建一个对象,只需要其名称就可以了。
    • 扩展性好,如果想增加一个产品,只需要增加一个扩展类就可以了。
    • 屏蔽了产品的具体实现,调用者只关心产品的接口。
  • 缺点:
    • 系统复杂度增加。

使用场景:

  • 日志记录器,日志可能记录到本地磁盘,系统事件,远程服务器等, 用户可以选择日志记录到哪里。
  • 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
2.Python实现
1
#!/usr/python/bin/python3
2
# -*- coding:utf-8 -*-
3
############################
4
#File Name: simple_factory_pattern.py
5
#Author: ykyk
6
#Mail: 525178992@qq.com
7
#Created Time: 2019-09-04 20:52:50
8
############################
9
10
11
class HttpMethod(object):
12
13
    def method(self):
14
        return NotImplemented("method must be implemented")
15
16
17
class GetHttpMethod(HttpMethod):
18
19
    def __init__(self):
20
        print('http get method')
21
22
    def method(self):
23
        print('Inside Get:method() method')
24
25
26
class PostHttpMethod(HttpMethod):
27
28
    def __init__(self):
29
        print('http post method')
30
31
    def method(self):
32
        print('Inside Post:method() method')
33
34
class PutHttpMethod(HttpMethod):
35
36
    def __init__(self):
37
        print('http put method')
38
39
    def method(self):
40
        print('Inside Put:method() method')
41
42
43
class HttpMethodFactory(object):
44
45
    def __init__(self):
46
        print("Simple Factory Pattern init")
47
48
    def getHttpmethod(self, method):
49
        if method.lower() == 'get':
50
            return GetHttpMethod()
51
        if method.lower() == 'post':
52
            return PostHttpMethod()
53
        if method.lower() == 'put':
54
            return PutHttpMethod()
55
56
if __name__ == '__main__':
57
    method_factory = HttpMethodFactory()
58
    method_get = method_factory.getHttpmethod('get')
59
    method_put = method_factory.getHttpmethod('put')
60
    method_post = method_factory.getHttpmethod('post')
61
62
    method_get.method()
63
    method_put.method()
64
    method_post.method()