python如何代替工厂模式_Python基础-单例模式/简单工厂模式/工厂方法模式(9)

单例模式:

一个类只创建一次。

单例模式1:

缺点是若对象需要传值,只会得到第一次的传值属性。

#单例模式1 通过类方法获取实例

#单例模式1 通过类方法获取实例

class User(object):

__instance=None

def __init__(self,name):

self.name=name

@classmethod #类方法

def get_instance(cls,name):

#当__instance为空时,创建对象

if not cls.__instance:

cls.__instance=User(name)

return cls.__instance

# 单例模式2 :在new方法创建对象的时候进行判断

#如果存在对象则不在进行创建

u1=User.get_instance('1')

u2=User.get_instance('2')

print(u1==u2) #true

print(u1.name) #1

print(u2.name) #1

单例模式2:

缺点是通过object.new(User1) 依然能创建出对象,这样创建是不会调用init()方法。这种创建和单例创建的对象是不一样的

class User1(object):

__instance=None

def __init__(self,name):

self.name=name

def __new__(cls,name):

#保证object.__new__()方法只会调用一次

if not cls.__instance:

cls.__instance=object.__new__(cls)

return cls.__instance

u1=User1('1')

u2=User1('2')

print(u1==u2) #true

#创建对象只有一次,但是对象的初始化有两次,因此保存的是最后一次的赋值

print(u1.name) #2

print(u2.name) #2

u3=object.__new__(User1)

print(u1==u3) #False

简单工厂模式:

使用工厂方法代替new操作的一种模式,会给系统带来可扩展性和较少的修改量

#使用工厂产品类

class Person(object):

def __init__(self,name):

self.name=name

def work(self,axe_type):

print('开始工作')

#根据需要的斧头类型通过工厂模式获取斧头

axe=Factory.create_axe(axe_type)

axe.cut_tree()

class Axe(object):

def __init__(self,name):

self.name=name

def cut_tree(self):

print('%s砍树',self.name)

#工厂具体产品1

class StoneAxe(Axe):

def cut_tree(self):

print('石斧砍树')

#工厂具体产品2

class SteelAxe(Axe):

def cut_tree(self):

print('铁斧砍树')

#工厂模式类,根据不同情况,提供不同解决方法

class Factory(object):

#根据用户指定类型来生产

@staticmethod

def create_axe(type):

if type=='stone':

return StoneAxe('石头')

elif type=='steel':

return SteelAxe('铁')

p=Person('ll')

p.work('steel')

工厂方法模式:

工厂方法模式去掉了简单工厂模式的静态属性,使得它可以被子类继承,就是工厂类被具体工厂继承,这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。

主要有以下几个角色:抽象工厂角色

具体工厂角色

抽象产品角色

具体产品角色

#使用工厂产品类

class Person(object):

def __init__(self,name):

self.name=name

def work(self):

print('开始工作')

#直接通过工厂子类获取斧头

axe=Steel_Axe_Factory().create_axe()

axe.cut_tree()

#产品抽象类

class Axe(object):

def __init__(self,name):

self.name=name

def cut_tree(self):

print('%s砍树',self.name)

#工厂具体产品1

class StoneAxe(Axe):

def cut_tree(self):

print('石斧砍树')

#工厂具体产品2

class SteelAxe(Axe):

def cut_tree(self):

print('铁斧砍树')

#工厂方法模式父类/工厂抽象类

class Factory(object):

def create_axe(self):

pass

#工厂子类1

class Stone_Axe_Factory(Factory):

def create_axe(self):

return StoneAxe('石头')

#工厂子类2

class Steel_Axe_Factory(Factory):

def create_axe(self):

return SteelAxe('铁')

p=Person('ll')

p.work()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值