Object oriented-5-singleton design pattern



class MusicPlayer(object):

    def __new__(cls, *args, **kwargs):

        # When you create an object, the new method is called automatically.
        print('Create objects, allocate space')

    def __init__(self):
        print('Initialization')

music= MusicPlayer()

print(music)


If the return value is not used, the address cannot be found. Moreover, class properties are not running. (initialization not printed)

class MusicPlayer(object):

    def __new__(cls, *args, **kwargs):

        # When you create an object, the new method is called automatically.
        print('Create objects, allocate space')

        return super().__new__(cls)

    def __init__(self):
        print('Initialization')

music= MusicPlayer()

print(music)

class MusicPlayer(object):

    pass

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)


When you create different objects, the addresses are different. But in singleton design mode, no matter how many objects are created, the address is the same. As follows:

class MusicPlayer(object):

    instance = None

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance =  super().__new__(cls)

        return cls.instance

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)


The address is exactly the same.

class MusicPlayer(object):

    instance = None

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance =  super().__new__(cls)

        return cls.instance

    def __init__(self):
        print('Initialization')

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)


You can see that it was initialized twice. But we only want to initialize once.

class MusicPlayer(object):

    instance = None

    init_flage = False

    def __new__(cls, *args, **kwargs):

        if cls.instance is None:
            cls.instance =  super().__new__(cls)

        return cls.instance

    def __init__(self):

        if MusicPlayer.init_flage:
            return

        print('Initialization')

        MusicPlayer.init_flage = True

player1 = MusicPlayer()
player2 = MusicPlayer()
print(player1)
print(player2)


Initialization was performed only once.

Posted by louie35 on Fri, 29 Nov 2019 07:52:06 -0800