Design 简单工厂模式

基本介绍

用户只需关注自身需要一个什么样的产品,而不用将注意力放在如何构建这个产品上。

只要用户构思好了,直接从工厂类的一个指定接口中去拿产品即可。

特点:对外隐藏,只暴露一个接口,但这个接口可以创建出非常多的用户所需要的产品

案例图示

假如一个用户要买车,他只需要考虑车的品牌、颜色、还有喷漆等,并不需要关注我去那里买,因为买车都有一个统一的地方:

image-20210411183417533

如果不采用简单工厂模式,向下面这样设计的话在用户买车时就会考虑很多,如要考虑去哪里买,还要自己通知厂家造车。

image-20210411183532342

优缺点

优点:

  • 隐藏对象创建的细节
  • 客户端不需要修改代码

缺点:

  • 违反单一职责原则,将创建逻辑集中到了一个工厂类里
  • 当添加新的产品时,需要修改工厂类的代码,违反了开闭原则

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实现简单工厂模式:

...
posted @ 2021-04-11 18:12  云崖君  阅读(48)  评论(0编辑  收藏  举报