Python简单工厂模式(字典实现)

工厂模式(工厂方法模式)是我们程序设计中比较经常使用的一种模式,为什么叫工厂模式,因为它的核心思想就是像工厂生产一样,我们只需要往工厂中输入原材料而不用管工厂是如何生产的,最终得到我们想要的产品,例如一个榨汁机,我们放入一个橙子榨出来的是一杯橙汁,放入一个苹果榨出来的就是一杯苹果汁。在程序设计中就类似于下面的代码。

可能在没有学设计模式的时候我们就用过这种方法,但是我们却不知道这其实就是简单工厂方法模式,当参数为photo的时候就调用input_photo()的方法,当输入参数为video的时候就调用input_video()的方法,然后返回不同的值,这就是最简单的工厂模式了,但是如果输入变得很多,十几个甚至更多,那么需要对每一个输入进行判断就需要一个if判断语句,程序看起来不美观,而且频繁地使用if else耗费大量的系统资源,降低了程序的性能,这并不是我们想要的结果。

def input_photo():
    print('play photo')
    return 'photo'

def input_video():
    print('play video')
    return 'video'

def inputProcess(input):
    output = None
    if input == 'photo':
        output = input_photo()
    elif input == 'video':
        output == input_video()
    else:
        return None
    return output

a = inputProcess('photo')
print(a)
b = inputProcess('video')
print(b)

列表和字典是Python的核心杀手锏,精通列表和字典的使用能省去很多代码,优化代码结构,拿上面的程序来讲,我们可以利用字典设计得更加精简一些,利用字典的get()方法不管输入类型有多少种,我们只需要判断一次就ok了,代码量减少了不少而且效率还提高了。

def input_photo():
    print('play photo')
    return 'photo'

def input_video():
    print('play video')
    return 'video'

INPUT_TYPE={'INPUT_PHOTO':input_photo, 'INPUT_VIDEO':input_video}

def inputProcess(input):
    output = None
    if INPUT_TYPE.get(input) is not None:
        output = INPUT_TYPE.get(input)()
    return output

a = inputProcess('INPUT_PHOTO')
print(a)
b = inputProcess('INPUT_VIDEO')
print(b)

值得注意的是Python字典可以存储类和方法变量,在上面的代码output = INPUT_TYPE.get(input)()output接收到的其实是一个程序执行完后返回的信息,将output = INPUT_TYPE.get(input)()改成output = INPUT_TYPE.get(input)程序返回的是一个函数的地址,这样我们就可以接收一个没有运行过的函数,类似于映射,在需要使用的时候再执行这个函数。

def input_photo():
    print('play photo')
    return 'photo'

def input_video():
    print('play video')
    return 'video'

INPUT_TYPE={'INPUT_PHOTO':input_photo, 'INPUT_VIDEO':input_video}

def inputProcess(input):
    output = None
    if INPUT_TYPE.get(input) is not None:
        output = INPUT_TYPE.get(input)
    return output

a = inputProcess('INPUT_PHOTO')
A = a()
print(A)
b = inputProcess('INPUT_VIDEO')
B = b()
print(B)
发布了92 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zZzZzZ__/article/details/104730997