python创建角色_Python Design Pattern - 4.创建型模式
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/11/29 18:06
# @Author : Antenna
# @Email : lilyef2000@163.com
# @File : creationalpatterns.py
# 1.简单工厂型模式
# 简单工厂模式不直接向客户端暴露对象创建
# 的细节,而是通过一个工厂类来负责创建产品类的实
# 例。简单工程模式的角色有:工厂角色、抽象产品角
# 色、具体产品角色
from abc import ABCMeta, abstractmethod
# 抽象产品角色,以什么样的表现去使用
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 产品角色
class Alipay(Payment):
def __init__(self,use_huabei=False):
self.use_huabei = use_huabei
def pay(self, money):
if self.use_huabei == True:
print("花呗支付了{0}元!".format(money))
else:
print("支付宝余额支付了{0}元!".format(money))
# 产品角色
class WechatPay(Payment):
def pay(self, money):
print("微信支付了%d元!" % (money))
# 工厂类角色
class PaymentFactory:
def ctreate_payment(self, method):
if method == 'Alipay':
return Alipay()
elif method == 'WechatPay':
return WechatPay()
elif method == 'HuabeiPay':
return Alipay(use_huabei=True)
else:
raise TypeError('No such payment named% s' % method)
# 客户端调用。不直接向客户端暴露对象创建的实现
# 细节,而是通过一个工厂类来负责创建产品类的实例
pf = PaymentFactory()
p = pf.ctreate_payment('HuabeiPay')
p.pay(100)
# 2.工厂方法模式
# 工厂模式方法模式的概念是定义了一个用于创建对
# 象的接口(工厂接口),让子类决定实例化那一个产品
# 类。角色有抽象工厂角色、具体工厂角色、抽象产品角
# 色和具体产品角色。
from abc import ABCMeta, abstractmethod
# 抽象产品角色
class Payment(metaclass=ABCMeta):
@abstractmethod
def pay(self, money):
pass
# 产品角色
class Alipay(Payment):
def __init__(self, use_huabei=False):
self.use_huabei = use_huabei
def pay(self, money):
if self.use_huabei == True:
print("花呗支付了{0}元!".format(money))
else:
print("支付宝支付了{0}元!".format(money))
# 产品角色
class WechatPay(Payment):
def pay(self, money):
print("微信支付了{0}元!".format(money))
# 抽象工厂角色
class PaymentFactory(metaclass=ABCMeta):
@abstractmethod
def create_payment(self):
pass
# 具体工厂角色
class AlipayFactory(PaymentFactory):
def create_payment(self):
return Alipay()
class WechatPayFactory(PaymentFactory):
def create_payment(self):
return Alipay()
class HuabeiFactory(PaymentFactory):
def create_payment(self):
return Alipay(use_huabei=True)
hfp = HuabeiFactory().create_payment()
hfp.pay(100) # 花呗支付了100元!
# 缺点是每增加一个具体产品类,就必须增加一个相应的具体方法
# 3.抽象工厂模式
# 定义一个工厂类的接口让工厂子
# 类来创建一系列相关或者相互依赖的对象 。相比工厂方法
# 模式,抽象工厂模式中的每一个具体工厂都生产一套产
# 品 。抽象工厂模式的角色有:抽象工厂角色、具体
# 工厂角色、抽象产品角色、具体产品角色和客户端。抽
# 象工厂模式的优点是:将客户端和类的具体实现相分
# 离;每个工厂创建了一个完整的产品系列 ,使得易于交
# 换产品系列;有利于产品的一致性,即产品之间的约束
# 关系。缺点是:难以支持新种类抽象产品 。
from abc import ABCMeta, abstractmethod
# ------抽象的产品------
class PhoneShell(metaclass=ABCMeta):
@abstractmethod
def show_shell(self):
pass
class PhoneCPU(metaclass=ABCMeta):
@abstractmethod
def show_cpu(self):
pass
class PhoneOS(metaclass=ABCMeta):
@abstractmethod
def show_os(self):
pass
# ------具体的产品------
class SmallShell(PhoneShell):
def show_shell(self):
print('普通手机小手机壳')
class BigShell(PhoneShell):
def show_shell(self):
print('普通手机大手机壳')
class AppleShell(PhoneShell):
def show_shell(self):
print('苹果手机壳')
class SnapDragonCPU(PhoneCPU):
def show_cpu(self):
print('骁龙CPU')
class HuaweiCPU(PhoneCPU):
def show_cpu(self):
print('化为CPU')
class AppleCPU(PhoneCPU):
def show_cpu(self):
print('苹果CPU')
class AndroidOS(PhoneOS):
def show_os(self):
print('IOS系统')
class AppleOS(PhoneOS):
def show_os(self):
print('安卓系统')
# ------抽象的工厂------
class PhoneFactory(metaclass=ABCMeta):
@abstractmethod
def make_shell(self):
pass
@abstractmethod
def make_cpu(self):
pass
@abstractmethod
def make_os(self):
pass
# ------具体的工厂------
class HuaweiFactory(PhoneFactory):
def make_shell(self):
return SmallShell()
def make_cpu(self):
return HuaweiCPU()
def make_os(self):
return AndroidOS()
class AppleFactory(PhoneFactory):
def make_shell(self):
return AppleShell()
def make_cpu(self):
return AppleCPU()
def make_os(self):
return AppleOS()
# ------客户端------
class Phone:
def __init__(self, shell, cpu, os):
self.shell = shell
self.cpu = cpu
self.os = os
def show_info(self):
print('手机信息:')
self.shell.show_shell()
self.cpu.show_cpu()
self.os.show_os()
def make_phone(factory):
shell = factory.make_shell()
cpu = factory.make_cpu()
os = factory.make_os()
return Phone(shell, cpu, os)
p = make_phone(HuaweiFactory())
p.show_info()
# 4.建造者模式
# 建造者模式是将一个复杂对象的构建与它的表
# 示分离,使得同样的构建过程可以创建不同的表示。角
# 色有抽象创建者、具体创建者、指挥者和产品。建造者
# 模式与抽象工厂模式相似,也用来创建复杂的对象。主
# 要区别是 建造者模式着重一步步构造一个复杂对象(控制
# 顺序)。而抽象工厂模式着重于多个系列的产品对象
from abc import ABCMeta, abstractmethod
# ------产品------
class Player:
def __init__(self, face=None, body=None, arms=None, legs=None):
self.face = face
self.body = body
self.arms = arms
self.legs = legs
def __str__(self):
return '%s,%s,%s,%s' % (self.face, self.body, self.arms, self.legs)
# ------抽象建造者------
class PlayerBuilder(metaclass=ABCMeta):
@abstractmethod
def build_face(self):
pass
@abstractmethod
def build_body(self):
pass
@abstractmethod
def build_arms(self):
pass
@abstractmethod
def build_legs(self):
pass
# ------具体建造者,隐藏了一个产品的内部结构------
class GirlBuilder(PlayerBuilder):
def __init__(self):
self.player = Player()
def build_face(self):
self.player.face = '漂亮的脸蛋'
def build_body(self):
self.player.body = '苗条的身材'
def build_arms(self):
self.player.arms = '细细的胳膊'
def build_legs(self):
self.player.legs = '大长腿'
# ------具体建造者,表示代码------
class MonsterBuilder(PlayerBuilder):
def __init__(self):
self.player = Player()
def build_face(self):
self.player.face = '绿脸'
def build_body(self):
self.player.body = '魁梧的身体'
def build_arms(self):
self.player.arms = '粗壮的胳膊'
def build_legs(self):
self.player.legs = '粗壮的大腿'
# ------指挥者,构造代码(构造代码和表示代码分开),可以对构造过程进行更加精细地控制 ------
class PlayerDirectory():
def builder_player(self, builder):
"""隐藏了装配过程:param builder::return:"""
builder.build_face()
builder.build_body()
builder.build_arms()
builder.build_legs()
return builder.player
# ------客户端------
builder = GirlBuilder()
director = PlayerDirectory()
p = director.builder_player(builder)
print(p)
# 5.单例模式
# 单例模式保证一个类只有一个实例,并提供一
# 个访问它的全局访问点。优点是对唯一实例的受控访问
# (只有一个实例),单例相当于全局变量,但防止了命
# 名空间被污染(变量命名不会有冲突)。
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
class MyClass(Singleton):
def __init__(self, a):
self.a = a
ms1 = MyClass(1)
ms2 = MyClass(2)
# print(ms1.a)
# print(id(ms1), id(ms2))
# 该例子在python3.6中不能成功运行,其实python中可以通过导入模块实现单实例运行.
python创建角色_Python Design Pattern - 4.创建型模式相关推荐
- 实战python设计模式_Python与设计模式之创建型模式及实战
用Python学习一下设计模式,如果很枯燥的话,就强行能使用的就用一下.设计模式参考Python与设计模式-途索 1. 单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. import ...
- 设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns)...
设计模式教程(Design Patterns Tutorial)笔记之一 创建型模式(Creational Patterns) 目录 · 概述 · Factory · What is the Fact ...
- python设计模式-创建型模式
简单工厂模式 简单工厂模式(Factory Pattern) 提供了一种创建对象的最佳方式.我们希望有一个工厂可以创造不同类型的对象,调用者在创建对象时,只需要指定其名字即可获取一个相应的对象,从而隐 ...
- .NET设计模式(7):创建型模式专题总结(Creational Pattern)
概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...
- 设计模式(6)——抽象工厂模式(Abstract Factory Pattern,创建型)
1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.抽象工厂模式(Abstract Factory Pattern)属于创建型模式,为创建一组相关或者相互依赖的对象(产品族)提供一个抽象 ...
- 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。
设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...
- 【设计模式·Python】创建型模式
设计模式中,创建型模式主要由以下几种: 工厂方法模式 抽象工厂模式 建造者模式 原型模式 单例模式 简单工厂模式 不直接向客户暴露对象的实现细节,而是通过一个工厂类来负责创建产品的实例. 角色: 工厂 ...
- Python常用设计模式—创建型模式
文章目录 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 四.建造者模型 五.单例模式 六.创建型模式概述 一.简单工厂模式 简单工厂模式不是23中设计模式中的,但是必须要知道.简单工厂模式不直 ...
- python设计模式(一)创建型模式
创建型模式(5种):工厂方法模式.抽象工厂模式.创建者模式.原型模式.单例模式 https://www.bilibili.com/video/BV19541167cn?spm_id_from=333. ...
最新文章
- 4月25日日志(4.25)
- React Native中文网
- 如何初始化结构体中的指针结构体_跟我一起学习go语言(五)golang中结构体的初始化方法...
- 怎样用计算机命令修复软件,电脑修复指令是什么
- 【观点】从曾成杰案看民间金融的高风险与银行缺失的机制创新
- 栅格单元值的选取方法_计算机求解微分方程的六大数值计算方法
- MFC操作读取excel文件
- 如何动/静 态 两种方式修改Static控件的颜色
- 15. 注意string实现的多样性
- 如何安装Vmware ESXi 6.7(图文介绍)
- 计算机职高会考知识,2013年金华市职高会考各科目考纲汇总.doc
- php 月份查询生日_PHP判断日期(生日)格式是否正确合法的方法
- 【Social listening实操】从社交媒体传播和文本挖掘角度解读《欢乐颂2》
- 智能人物画像综合分析系统——Day1
- The system proxy was changed. Click to reenable capturing.
- 基于A*算法的迷宫游戏
- 力扣(300,674)补9.11
- 微软张宏江:创新流程是打造创新能力的突破口
- 小说里的编程 【连载之十一】元宇宙里月亮弯弯
- 数理统计之协方差矩阵