python-单例模式&工厂模式

1.单例模式

  类外装饰器实现单例模式,是拦截整个实例化过程。(__new__;__init__)

def singleton(cls):
    _instance = {}
    def func(*args,**kwargs):
        if cls not in _instance:
            _instance[cls] = cls(*args,**kwargs)
        return _instance[cls]
    return func

@singleton
class Test(object):
    def __init__(self,name):
        self.name = name

if __name__ == ‘__main__‘:
    a = Test(‘BOB‘)
    b = Test(‘JON‘)

    print(a is b)
    print(id(a),id(b))
在上面,我们定义了一个装饰器 singleton,它返回了一个内部函数 func,该函数会判断某个类是否在字典 _instances 中,如果不存在,则会将 cls 作为 key,cls(*args, **kwargs) 作为 value 存到 _instances 中,否则,直接返回 _instances[cls]。 
class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls,*args,**kwargs)
        return cls._instance

class Test(Singleton):

    def __init__(self):
        self.name = ‘bob‘

if __name__ == ‘__main__‘:
    a = Test()
    b = Test()

    print(a is b)

*************************************************************************************************************************************************
# instance_dict = {}## class B(object):#     __float = 0##     def __new__(cls, *args, **kwargs):#         if cls not in instance_dict:#             instance_dict[cls] = object.__new__(cls, *args, **kwargs)##         return instance_dict[cls]##     def __init__(self, name):#         if self.__float == 0:#             self.my_name = name#             self.__float = 1### if __name__ == ‘__main__‘:#     a = B(1)#     b = B(2)#     print a.my_name, b.my_name
类内实现单例模式,只拦截了__new__生成对象的过程,没有拦截初始化实例属性的过程

拦截__new__方法实现单例模式,新式类为主


原文地址:https://www.cnblogs.com/jiuzha/p/9362679.html

时间: 2024-10-15 21:57:26

python-单例模式&工厂模式的相关文章

用Python实现工厂模式

class CarFactory: '''用Python实现工厂模式''' def creatCar(self, car_name): if car_name == 'Benz': car = Benz() elif car_name == 'BMW': car = BMW() else: car = BYD() return car class Benz: def __init__(self): print('奔驰产生了') class BMW: def __init__(self): pri

php基础---单例模式&&工厂模式

//PHP设计模式 //工厂模式:工厂类 用于创建对象 interface Dongwu { function say(); } class Mao implements Dongwu { public function say() { echo "喵喵!我是一只小野猫!"; } } //工厂类,用来创建猫类 class GongChang { public static function GetObj($className) { return new $className(); }

单例模式工厂模式

单例模式 单例模式的目的就是为了控制特定的类只产生一个对象. 产生单例的步骤: 1.构造方法私有化(在构造方法前面加prevate static finall)为的是不让其他类创建该类的实例化对象. 2.在类中自己创建自己的实例化对象. 3.写一个方法,返回该实例化对象. 4.在该类中还可以写其他的方法. 具体的代码如下: public class Danli { // 构造方法私有化,让其他类调用不到 private Danli() { } // 在类中自己创建自己的实例化对象, privat

PHP 设计模式 单例模式 工厂模式 注册模式

1.工厂模式,工厂方法或者类生成对象,而不是在代码中直接new 2.单例模式,使某个类的对象仅允许创建一个 3.注册模式,全局共享和交换对象 项目文件目录 入口文件 index.php 1 <?php 2 /** 3 * Created by PhpStorm. 4 * Author: Administrator 5 * Date: 14-11-22 6 * Time: 下午3:42 7 */ 8 9 define('BASEDIR',__DIR__); 10 include BASEDIR.'

python简单工厂模式解析

下面考虑<大话设计模式>中的一个例子: 题目:用任意一种面向对象语言实现一个计算器控制台程序.要求输入两个数和运算符号,得到结果. 题目分析: 程序应该做到:(1)可维护:(2)可复用:(3)可扩展:(4)灵活性好.可维护:就是说代码一处更改,不能产生连锁反应,不能影响其他地方.可复用:尽量减少重复性代码.可扩展:如果要扩展新的功能.新的业务,则只需要增加新的类就好了,不对已有的类和逻辑产生影响.插拔式的应用. 面向对象要点:面向对象三大特性:封装.继承.多态.通过封装.继承.多态把程序耦合降

Python实现工厂模式

from abc import ABCMeta, abstractmethod from enum import Enum class Person(metaclass=ABCMeta): @abstractmethod def get_name(self): raise NotImplementedError("You should implement this!") class Villager(Person): def get_name(self): return "V

(一)Python入门-6面向对象编程:12设计模式之工厂模式-单例模式

一:工厂模式实现 设计模式是面向对象语言特有的内容,是我们在面临某一类问题时候固定的做法,设计 模式有很多种,比较流行的是:GOF(Goup Of Four)23 种设计模式. 工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类.创建对象进 行统一的管理和控制. [操作] #工厂模式实现 class CarFactory: def creatCar(self,brand): if brand == '奔驰': return Benz() elif brand == '宝马': re

单例模式和工厂模式(百度文库)

模式中的单例模式分为:饿汉模式和懒汉模式. 顾名思义: 饿汉模式是对食物(Singleton)比较渴望的,所有一开始就new了一个来满足(食欲) 饿汉式: public class Singleton{   private static Singleton singleton = new Singleton ();   private Singleton (){}   public static  Singleton getInstance(){return singletion;}   } 饿

Python 设计模式--简单工厂模式

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul

php面向对象单例模式、工厂模式及6大原则

一.单例模式目的:为了控制对象的数量(只能够有一个,相当于类的计划生育)做法1.将类的构造函数做成私有的2.在类里面做了一个公有的函数来造对象3.将该函数变为静态的4.在函数里面加控制 class Ren { public $name; static public $dx; //静态成员变量用来存储该对象 private function __construct() //把构造函数设置为私有,类的外部就不能用new造对象了 { } static function DuiXiang() //做一个