python - 编程中【工厂模式】和【单例模式】有什么区别以及代码示例
  OHxphH6Es7WL 2023年11月14日 26 0


一. 概念

工厂模式和单例模式都是面向对象编程中常用的设计模式。

  1. 工厂模式(FactoryPattern):是一种创建型模式,它提供了一种方法来创建对象,而不需要暴露对象的创建逻辑。这种模式通过定义一个工厂类,通过工厂方法来创建对象。工厂模式可以将对象的创建过程独立到一个单独的工厂类中,从而实现解耦,降低系统的耦合性,并提高系统的可扩展性和可维护性。工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式等。
  2. 单例模式(Singleton Pattern):是一种创建型模式,它保证一个类只有一个实例,并提供一个全局访问点,让外界能够访问到这个实例。单例模式可以避免系统中出现过多的重复对象,从而提高系统的性能和效率。确保一个类只有一个实例存在,从而实现对象的共享和控制对象的创建,同时可以提高系统性能。

二. 区别

1. 目的不同

工厂模式的主要目的是将对象的创建过程独立到一个单独的工厂类中,从而实现解耦,降低系统的耦合性,并提高系统的可扩展性和可维护性;而单例模式的主要目的是确保一个类只有一个实例存在,从而实现对象的共享和控制对象的创建。

2. 返回值不同

工厂模式通常会返回一个新的对象实例,而单例模式则会返回同一个实例。

3. 实现方式不同

工厂模式通常会定义一个工厂类,用于创建对象,可以根据不同的参数值来创建不同的对象实例;而单例模式则需要在类中定义一个静态成员对象,通过调用类的静态方法来获取这个对象实例。

三. 示例代码

工厂模式示例代码

class Car:
    def __init__(self, brand):
        self.brand = brand

    def run(self):
        print(f'{self.brand} car is running')


class CarFactory:
    def create(self, brand):
        return Car(brand)


car_factory = CarFactory()
car1 = car_factory.create('BMW')
car1.run()
car2 = car_factory.create('Benz')
car2.run()
print(car1 is car2)

运行结果

python - 编程中【工厂模式】和【单例模式】有什么区别以及代码示例_javascript

可以看到以上运行的结果,实例对象传进去的参数输出都是独立的,并且对象也都是不一样的。

单例模式示例代码

class Singleton:
    __instance = None

    def __new__(cls):
        if not cls.__instance:
            cls.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self):
        self.at = False

    def set_at(self, a):
        if a:
            self.at = True
        else:
            self.at = False


if __name__ == '__main__':
    s1 = Singleton()
    s2 = Singleton()

    print('s1 is s2 --->', s1 == s2)  # True
    s1.set_at(0)
    print('set s1 at -->', s1.at)
    print('s2 at ------>', s2.at)
    s2.set_at(1)
    print('set s2 at -->', s2.at)
    print('=====================')
    print('s1 at -->', s1.at)
    print('s2 at -->', s2.at)

运行结果

python - 编程中【工厂模式】和【单例模式】有什么区别以及代码示例_单例模式_02


从以上运行结果我们可以看到,两个实列s1和s2创建之后是指向同一个对象的,在设置属性时也是以最后的实例设置的结果为准。

四. 总结

工厂模式和单例模式是两种不同的设计模式,它们的目的和实现方式都有所不同。工厂模式主要用于对象的创建,单例模式则主要用于对象的共享。在实际应用中,我们可以根据具体的需求和场景进行选择。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  f18CFixvrKz8   2024年05月20日   88   0   0 JavaScript
  fxrR9b8fJ5Wh   2024年05月17日   52   0   0 JavaScript
OHxphH6Es7WL