• Builder和Factory设计模式理解


    What is the difference between Builder Design pattern and Factory Design pattern? - Stack Overflow

    A factory is simply a wrapper function around a constructor (possibly one in a different class). The key difference is that a factory method pattern requires the entire object to be built in a single method call, with all the parameters passed in on a single line. The final object will be returned.

    A builder pattern, on the other hand, is in essence a wrapper object around all the possible parameters you might want to pass into a constructor invocation. This allows you to use setter methods to slowly build up your parameter list. One additional method on a builder class is a build() method, which simply passes the builder object into the desired constructor, and returns the result.

    In static languages like Java, this becomes more important when you have more than a handful of (potentially optional) parameters, as it avoids the requirement to have telescopic constructors for all the possible combinations of parameters. Also a builder allows you to use setter methods to define read-only or private fields that cannot be directly modified after the constructor has been called.

    上述为Stackoverflow的回答。

    简单来说就是:

    factory模式就是在你定义了一个class A之后,再定义一个AFactory类,来单独存放A class的各种构造函数。AFactory的每一个函数都会返回A的一个对象。

    factory模式在java中较为常见,在python,go,C++中几乎不会见到,因为java在new一个对象时只能使用class的同名构造函数,只能用过参数个数来区分不同的同名构造函数。而其他语言大多支持自定义名称的构造函数因此无需额外的Factory类。

    以python为例,我们看下两者的区别:

    # coding=utf-8
    # @Time: 2022/1/10 17:59
    from typing import List
    
    
    class A(object):
        def __init__(self, name: str):
            self.__name = name
    
        @classmethod
        def NewAFromList(cls, strs: List[str]):
            AList = []
            for s in strs:
                cls_kwargs = {"name": s}
                AList.append(cls(**cls_kwargs))
            return AList
    
        def __repr__(self):
            return self.__name
    
    
    class AFactory(object):
        @staticmethod
        def NewAFromList(strs: List[str]) -> List[A]:
            AList = []
            for s in strs:
                AList.append(A(name=s))
            return AList
    
    
    if __name__ == '__main__':
        # As = A.NewAFromList(["a", "b"])
        # for e in As:
        #     print(e)
    
        Af = AFactory()
        As = Af.NewAFromList(strs=["a", "b"])
        for e in As:
            print(e)
    

    上述python的demo中,直接使用A的构造函数NewAFromList就很方便了,虽然额外加一个AFactory也能实现需求,但明显是多此一举。就算A有几十种构造函数也没什么必要单独拉一个Factory类出来。factory模式中每一个Factory的函数都相当于原始类的一个构造函数,它会直接返回要构造的原始对象,但builder模式不同,它构建最终返回对象的步骤是一步一步来的,每一步都会返回builder类本身,相当于每一步返回一个半成品(即构造原始对象的一个组件),直到最后的build()函数才会返回最终对象,返回的最终对象具体包含什么组件,取决于你调用了构造类的哪些函数。builder模式的作用与factory的区别这里就体现出来了,builder模式在java以外的其他语言中也有其使用价值,可以用于构造复杂的可变对象。直接上一个demo最好:

    # coding=utf-8
    # @Time: 2022/1/10 17:59
    
    
    class A(object):
        def __init__(self, name: str, gender: str = None, age: int = None):
            self.__name = name
            self.__gender = gender
            self.__age = age
    
        def setName(self, name: str):
            self.__name = name
    
        def setGender(self, gender: str):
            self.__gender = gender
    
        def setAge(self, age: int):
            self.__age = age
    
        def info(self):
            print("Name: %s, Gender: %s, Age: %s" % (self.__name,
                                                     self.__gender if self.__gender else "Unknown",
                                                     self.__age if self.__age else "Unknown"))
    
    
    class ABuilder(object):
        def __init__(self):
            self.__A = A(name=None)
    
        def addName(self, name: str):
            self.__A.setName(name)
            return self
    
        def addGender(self, gender: str):
            self.__A.setGender(gender)
            return self
    
        def addAge(self, age: str):
            self.__A.setAge(age)
            return self
    
        def build(self) -> A:
            return self.__A
    
    
    if __name__ == '__main__':
        chen = ABuilder().addName("chen").addAge(10).build()
        iuna = ABuilder().addName("iuna").build()
        chen.info()
        iuna.info()
    

      

  • 相关阅读:
    渣渣菜鸡的蚂蚁金服面试经历(一)
    20 个案例教你在 Java 8 中如何处理日期和时间?
    Spring Boot 2.0系列文章(七):SpringApplication 深入探索
    分布式锁看这篇就够了
    Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
    20135337朱荟潼——实验三
    20135337朱荟潼Java实验报告二
    5337朱荟潼Java实验报告一
    Linux内核设计笔记12——内存管理
    Linux内核设计笔记11——定时器
  • 原文地址:https://www.cnblogs.com/realcp1018/p/15878579.html
Copyright © 2020-2023  润新知