Design 简单工厂模式
基本介绍
用户只需关注自身需要一个什么样的产品,而不用将注意力放在如何构建这个产品上。
只要用户构思好了,直接从工厂类的一个指定接口中去拿产品即可。
特点:对外隐藏,只暴露一个接口,但这个接口可以创建出非常多的用户所需要的产品
案例图示
假如一个用户要买车,他只需要考虑车的品牌、颜色、还有喷漆等,并不需要关注我去那里买,因为买车都有一个统一的地方:
如果不采用简单工厂模式,向下面这样设计的话在用户买车时就会考虑很多,如要考虑去哪里买,还要自己通知厂家造车。
优缺点
优点:
- 隐藏对象创建的细节
- 客户端不需要修改代码
缺点:
- 违反单一职责原则,将创建逻辑集中到了一个工厂类里
- 当添加新的产品时,需要修改工厂类的代码,违反了开闭原则
Python实现
用Python实现简单工厂模式:
#! /usr/local/bin/python3
# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod
# 定义一个车工厂的抽象基类
class Car(metaclass=ABCMeta):
@abstractmethod
def build_car(self):
"""造车"""
pass
@abstractmethod
def get_car(self):
"""提车"""
pass
class Benz(Car):
"""奔驰"""
def __init__(self, name, color):
self.name = name
self.color = color
self.__result = None
def build_car(self):
self.__result = "一辆奔驰的车造好了,%s的车身上有一个炫酷的喷漆:%s" % (self.color, self.name)
def get_car(self):
return self.__result
class BMW(Car):
"""宝马"""
def __init__(self, name, color):
self.name = name
self.color = color
self.__result = None
def build_car(self):
self.__result = "一辆宝马的车造好了,%s的车身上有一个炫酷的喷漆:%s" % (self.color, self.name)
def get_car(self):
return self.__result
class CarShop(object):
def get_car(self, brand, name, color):
brand_dic = {
"Benz": Benz,
"BMW": BMW,
}
cls = brand_dic.get(brand)
if cls:
instance = cls(name, color)
# 通知造车
instance.build_car()
# 通知取车
return instance.get_car()
else:
return "暂时没有你想要的品牌"
if __name__ == '__main__':
shop = CarShop()
car01 = shop.get_car("Benz", "牛逼", "黑色")
print(car01)
car02 = shop.get_car("BMW", "炫酷", "红色")
print(car02)
car03 = shop.get_car("Audi", "猖狂", "黄色")
print(car03)
执行结果:
一辆奔驰的车造好了,黑色的车身上有一个炫酷的喷漆:牛逼
一辆宝马的车造好了,红色的车身上有一个炫酷的喷漆:炫酷
暂时没有你想要的品牌
Golang实现
用Golang实现简单工厂模式:
...