Python的单件模式(Singleton)和接口模式(Interface)
2020-06-30 13:56
85 查看
Python的单件模式(Singleton)和接口模式(Interface)
前言
近些年来,python的使用率越来越高,各种库的下载、安装和调用也远比C语言方便的多。为了和时代接轨,我老板一门课的大作业代码需要从原来的C++代码转变为Python版本的代码。
由于是工程计算的代码,涉及到的程序设计模式就只有单件模式(Singleton)和接口模式(Interface)。这里简单地介绍一下并给出python的代码实现。
单件模式
作用
单件模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 保证:需要从代码上确保运行时单件类仅仅只有一个实例;
- 访问:需要存在一个方法(method)能够返回那一个实例;
C++实现
// ADD.h class ADD { private: static ADD* _instance; // The unique instance during Runtime int x; protected: ADD(); public: static ADD* Instance(); // The Acess to the unique instance int get_x() {return x;} void self_add() {x++;} }; // ADD.cpp #include "ADD.h" ADD* ADD::_instance = nullptr; ADD::ADD() { x = 0; } ADD* ADD::Instance() { if (!_instance) _instance = new ADD(); return _instance; } // main.cpp #include "ADD.h" #include <iostream> using namespace std; int main() { ADD* A1 = ADD::Instance(); A1.self_add(); cout << A1.get_x() << endl; ADD* A2 = ADD::Instance(); A2.self_add(); cout << A2.get_x() << endl; return 0; }
Python实现
#!/usr/bin/env python3 # -*- coding: utf-8 -*- class Singleton(object): _Instance = {} def __init__(self, cls): self.cls = cls def __call__(self, *args, **kwargs): instance = self._Instance.get(self.cls, None) if not instance: instance = self.cls(*args, **kwargs) self._Instance[self.cls] = instance return instance def __getattr__(self, item): return getattr(self.cls, item, None) if __name__ == "__main__": @Singleton class ADD(object): def __init__(self): self.x = 0 def self_add(self): self.x += 1 A1 = ADD() A1.self_add() print(A1.x) A2 = ADD() print(A2.x) A2.self_add() print(A2.x)
评价
从上述两段代码可以看出,python的单件模式实现起来更为简单,并且代码的重用率较高。C++需要针对每一个单件类进行单件模式的实现,而python只需要实现一次,然后在每个单件类前==@Singleton==即可。
接口模式
作用
将提供相同功能的类抽象出一个接口类,该接口类中定义这些相同功能的接口函数,并且所有类需要继承这个接口类并且重载相应的接口函数。
- 抽象的接口类:该接口类不能被实例化;
- 继承并重载:子类需要重载全部的接口函数,否则无法实例化;
C++实现
class Base_Add { public: int x; Base_Add() {x = 0;} virtual void self_add() = 0; // 存在纯虚函数的类无法实例化 }; class Add_1: public Base_Add { public: Add_1(): Base_Add() {} virtual void self_add() {x += 1;} }; class Add_2: public Base_Add { public: Add_2(): Base_Add() {} virtual void self_add() {x += 2;} };
Python实现
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import abc class Base_Add(metaclass=abc.ABCMeta): def __init__(self): self.x = 0 @abc.abstractmethod def self_add(self): pass class Add_1(Base_Add): def __init__(self): super().__init__() def self_add(self): self.x += 1 class Add_2(Base_Add): def __init__(self): super().__init__() def self_add(self): self.x += 2
评价
C++和Python的接口模式的实现基本一致,C++中使用纯虚函数、Python中使用抽象类的abc.abstractmethod来保证基类无法实例化。
相关文章推荐
- Python和Singleton (单件)模式
- Python中的Singleton (单件)模式
- Python和Singleton (单件)模式
- Python和Singleton (单件)模式
- Python和Singleton (单件)模式[转载]
- 【设计模式】单件模式(Singleton)--各类单件模式的比较
- Python - 单例模式(Singleton)(转)
- 温故而知新:设计模式之单件模式(Singleton)
- 设计模式学习笔记(二)——Singleton单件模式
- Android设计模式之策略(接口interface)
- Singleton 单件模式及其变体 Double-Checked Locking 双重检查锁模式
- JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展
- 单件模式(singleton)
- C#面向对象设计模式学习笔记(1) - Singleton 单件模式(创建型模式)
- 对象创建型——单件模式(Singleton)
- Singleton单件模式的思考
- 1.5 Singleton(单件) -- 对象创建型模式
- 设计模式系列Python实现(一)-单例模式(Singleton)
- Singleton (单件模式)
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)