设计模式和 Singleton 模式简介

设计模式为软件设计中的 commonly occurring problems 提供了解决方案。设计模式首先由 GoF(Gang of Four) 引入,他们将常见模式描述为一遍又一遍地出现的问题以及这些问题的解决方案。

设计模式有四个基本要素:

  1. The pattern name 是一个我们可以用来描述设计问题,它的解决方案和一两个字的后果的句柄。
  2. The problem 描述了何时应用模式。
  3. The solution 描述了构成设计的元素,它们之间的关系,责任和协作。
  4. The consequences 是应用模式的结果和权衡。

设计模式的优点:

  1. 它们可以在多个项目中重复使用。
  2. 问题的架构层面可以解决
  3. 它们经过时间考验并经过充分验证,这是开发人员和架构师的经验
  4. 他们有可靠性和依赖性

设计模式可分为三类:

  1. 创作模式
  2. 结构模式
  3. 行为模式

Creational Pattern - 他们关心的是如何创建对象并且它们隔离了对象创建的细节。

Structural Pattern - 他们设计类和对象的结构,以便他们可以组合以获得更大的结果。

Behavioral Pattern - 他们关注物体之间的相互作用和物体的责任。

单例模式

它是一种 creational pattern,它提供了一种机制,只有一个和一个给定类型的对象,并提供一个全局访问点。

例如,Singleton 可用于数据库操作,我们希望数据库对象保持数据一致性。

履行

我们可以通过仅创建一个 Singleton 类的实例并再次提供相同的对象来在 Python 中实现 Singleton Pattern。

class Singleton(object):
    def __new__(cls):
        # hasattr method checks if the class object an instance property or not.
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance

s = Singleton()
print ("Object created", s)

s1 = Singleton()
print ("Object2 created", s1)

输出:

('Object created', <__main__.Singleton object at 0x10a7cc310>)
('Object2 created', <__main__.Singleton object at 0x10a7cc310>)

请注意,在 C++或 Java 等语言中,此模式是通过使构造函数为私有并创建执行对象初始化的静态方法来实现的。这样,在第一次调用时创建一个对象,然后类返回相同的对象。但在 Python 中,我们没有任何方法可以创建私有构造函数。

工厂模式

工厂模式也是一个 Creational patternfactory 一词意味着一个类负责创建其他类型的对象。有一个类充当工厂,其中包含与之关联的对象和方法。客户端通过使用某些参数调用方法来创建对象,并且工厂创建所需类型的对象并将其返回给客户端。

from abc import ABCMeta, abstractmethod

class Music():
    __metaclass__ = ABCMeta
    @abstractmethod
    def do_play(self):
        pass

class Mp3(Music):
    def do_play(self):
        print ("Playing .mp3 music!")
    
class Ogg(Music):
    def do_play(self):
        print ("Playing .ogg music!")
    
class MusicFactory(object):
    def play_sound(self, object_type):
        return eval(object_type)().do_play()
    
if __name__ == "__main__":
    mf = MusicFactory()
    music = input("Which music you want to play Mp3 or Ogg")
    mf.play_sound(music)

输出:

Which music you want to play Mp3 or Ogg"Ogg"
Playing .ogg music!

MusicFactory 是这里的工厂类,它根据用户提供的选择创建 Mp3Ogg 类型的对象。