设计模式-创建模式

简单工厂模式

# 一个工厂管多件产品"""
内容:
    不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。
角色:
    工厂角色(Creator)
    抽象产品角色(Product)
    具体产品角色(Concrete Product)
"""
# 优缺点:
"""
优点
    隐藏了对象创建的实现细节
    客户端不需要修改代码
缺点:
    违反了单一职责原则,将创建逻辑几种到一个工厂类里
    当添加新产品时,需要修改工厂类代码,违反了开闭原则

"""

代码实现

from abc import abstractmethod, ABCMeta

class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        raise NotImplementedError

class Alipay(Payment):
    def __init__(self, use_huabei=False):
        self.use_huabei = use_huabei

    def pay(self, money):
        if self.use_huabei:
            print("花呗支付%s元" % money)
        else:
            print("支付宝支付%s元" % money)

class ApplePay(Payment):
    def __init__(self):
        pass
    def pay(self, money):
        print("苹果支付%s元" % money)

class PaymentFactory:  # 隐藏对象创建的细节,客户端不序修改代码,相当于中间人
    def create_payment(self, method):
        if method == "alipay":
            return Alipay()
        elif method == "applepay":
            return ApplePay()
        elif method == "huabei":
            return Alipay(use_huabei=True)
        else:
            raise NameError(method)

# p = Alipay()

factory = PaymentFactory()
p = factory.create_payment("huabei")
p.pay(100)

工厂方法模式

# 一个工厂管一件产品

# 内容:
    定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类。

# 角色:
    抽象工厂角色(Creator) 接口
    具体工厂角色(Concrete Creator)
    抽象产品角色(Product)
    具体产品角色(Concrete Product)

工厂方法模式相比简单工厂模式将每个具体产品都对应了一个具体工厂。

# 使用场景

    需要生产多种、大量复杂对象的时候
    需要降低耦合度的时候
    当系统中的产品种类需要经常扩展的时候

# 优缺点
"""
优点:
    每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
    隐藏了对象创建的实现细节
缺点:
    每增加一个具体产品类,就必须增加一个相应的具体工厂类
"""

代码实现

from abc import abstractmethod, ABCMeta

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:
            print("花呗支付%s元" % money)
        else:
            print("支付宝支付%s元" % money)

class ApplePay(Payment):
    def pay(self, money):
        print("苹果支付%s元" % money)

class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%s元" % money)

class PaymentFactory(metaclass=ABCMeta):
    @abstractmethod
    def create_payment(self):
        pass

class AlipayFactory(PaymentFactory):
    def create_payment(self):
        return Alipay()

class ApplePayFactory(PaymentFactory):
    def create_payment(self):
        return ApplePay()

class HuabeiFactory(PaymentFactory):
    def create_payment(self):
        return Alipay(use_huabei=True)

class WechatFactory(PaymentFactory):
    def create_payment(self):
        return WechatPay()

factory = HuabeiFactory()
p = factory.create_payment()
p.pay(100)

抽象工厂模式

# 相比工厂方法模式,每个抽象工厂模式中的每个具体工厂都生产一套产品。

"""
内容:
    定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。
例:
    生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,其中每类对象都有不同的种类。对每个具体工厂,分别生产一部手机所需要的三个对象。
角色:
    抽象工厂角色(Creator)
    具体工厂角色(Concrete Creator)
    抽象产品角色(Product)
    具体产品角色(Concrete Product)
    客户端(Client)

相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品。
"""
# 适用场景
"""
系统要独立于产品的创建与组合时
强调一系列相关的产品对象的设计以便进行联合使用时
提供一个产品类库,想隐藏产品的具体实现时
"""
# 优缺点
"""
优点:
    将客户端与类的具体实现相分离
    每个工厂创建了一个完整的产品系列,使得易于交换产品系列
    有利于产品的一致性(即产品之间的约束关系)
缺点:
    难以支持新种类的(抽象)产品
"""

代码实现

from abc import abstractmethod, ABCMeta

# ------抽象产品------

class PhoneShell(metaclass=ABCMeta):
    @abstractmethod
    def show_shell(self):
        pass

class CPU(metaclass=ABCMeta):
    @abstractmethod
    def show_cpu(self):
        pass

class OS(metaclass=ABCMeta):
    @abstractmethod
    def show_os(self):
        pass

# ------抽象工厂------

class PhoneFactory(metaclass=ABCMeta):
    @abstractmethod
    def make_shell(self):
        pass

    @abstractmethod
    def make_cpu(self):
        pass

    @abstractmethod
    def make_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(CPU):
    def show_cpu(self):
        print("骁龙CPU")

class MediaTekCPU(CPU):
    def show_cpu(self):
        print("联发科CPU")

class AppleCPU(CPU):
    def show_cpu(self):
        print("苹果CPU")

class Android(OS):
    def show_os(self):
        print("Android系统")

class IOS(OS):
    def show_os(self):
        print("iOS系统")

# ------具体工厂------

class MiFactory(PhoneFactory):
    def make_cpu(self):
        return SnapDragonCPU()

    def make_os(self):
        return Android()

    def make_shell(self):
        return BigShell()

class HuaweiFactory(PhoneFactory):
    def make_cpu(self):
        return MediaTekCPU()

    def make_os(self):
        return Android()

    def make_shell(self):
        return SmallShell()

class IPhoneFactory(PhoneFactory):
    def make_cpu(self):
        return AppleCPU()

    def make_os(self):
        return IOS()

    def make_shell(self):
        return AppleShell()

# ------客户端------

class Phone:
    def __init__(self, cpu, os, shell):
        self.cpu = cpu
        self.os = os
        self.shell = shell

    def show_info(self):
        print("手机信息:")
        self.cpu.show_cpu()
        self.os.show_os()
        self.shell.show_shell()

def make_phone(factory):
    cpu = factory.make_cpu()
    os = factory.make_os()
    shell = factory.make_shell()
    return Phone(cpu, os, shell)

p1 = make_phone(IPhoneFactory())
p1.show_info()

建造者模式

# 建造者模式与抽象工厂模式相似,也用来创建复杂对象。着重构造顺序

"""
内容:
    将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
角色:
    抽象建造者(Builder)
    具体建造者(Concrete Builder)
    指挥者(Director)
    产品(Product)

建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,
    而抽象工厂模式着重于多个系列的产品对象。
"""
# 适用场景
"""
    当创建复杂对象的算法(Director)应该独立于该对象的组成部分以及它们的装配方式(Builder)时
    当构造过程允许被构造的对象有不同的表示时(不同Builder)。
"""
# 优缺点
"""
优点
    隐藏了一个产品的内部结构和装配过程
    将构造代码与表示代码分开
    可以对构造过程进行更精细的控制
"""

代码实现

from abc import abstractmethod, ABCMeta

# ------产品------

class Player:
    def __init__(self, face=None, body=None, arm=None, leg=None):
        self.face = face
        self.arm = arm
        self.leg = leg
        self.body = body

    def __str__(self):
        return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg)

# ------建造者------

class PlayerBuilder(metaclass=ABCMeta):
    @abstractmethod
    def build_face(self):
        pass

    @abstractmethod
    def build_arm(self):
        pass

    @abstractmethod
    def build_leg(self):
        pass

    @abstractmethod
    def build_body(self):
        pass

    @abstractmethod
    def get_player(self):
        pass

class BeautifulWomanBuilder(PlayerBuilder):
    def __init__(self):
        self.player = Player()

    def build_face(self):
        self.player.face = "漂亮脸蛋"

    def build_arm(self):
        self.player.arm = "细胳膊"

    def build_body(self):
        self.player.body = "细腰"

    def build_leg(self):
        self.player.leg = "长腿"

    def get_player(self):
        return self.player

class PlayerDirector:  # 控制顺序
    def build_player(self, builder):
        builder.build_body()
        builder.build_face()
        builder.build_arm()
        builder.build_leg()
        return builder.get_player()

pd = PlayerDirector()
pb = BeautifulWomanBuilder()
p = pd.build_player(pb)
print(p)

单例模式

# 内容:
    保证一个类只有一个实例,并提供一个访问它的全局访问点。
# 角色:
    单例(Singleton)
# 适用场景
    当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
    文件系统
    数据库连接对象
    日志对象
# 优点:
    对唯一实例的受控访问
    单例相当于全局变量,但防止了命名空间被污染

# 与单例模式功能相似的概念:
    全局变量、静态变量(方法)

实例

class Singleton(object):
    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,name=None):
        if name is not None:
            self.name=name

a = MyClass("a")

print(a)
print(a.name)

b = MyClass("b")

print(b)
print(b.name)

print(a)
print(a.name)

小结

使用抽象工厂模式,prototype(原型模式)或者建造者模式的设计甚至比使用工厂方法模式的那些设计更灵活,但他们也更加复杂。通常,设计以使用工厂方法模式开始,当设计者发现需要更大的灵活性时,设计便会向其他创建模式演化。当你在设计标准之间进行权衡的时候,了解多个模式可以给你提供更多的选择余地

依赖于继承的创建型模式:
    工厂方法模式
依赖于组合的创建性模式:
    抽象工厂模式、创建者模式

1

原文地址:https://www.cnblogs.com/daofaziran/p/11007082.html

时间: 2024-10-27 19:49:49

设计模式-创建模式的相关文章

java设计模式 -------- 创建模式 之 单例模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 单例模式也是创建模式中的一种. 单例模式: 所谓的单例模式,即单一的实例,保证类在内在中只有一个对象. 举例: windows的打印服务,网络计数器 应用: 线程池,数据库连接池,Runtime 在应用单例模式前,先来看一个例子. Student.java public class Student { } StudentTest.java public class Studen

java设计模式 -------- 创建模式 之 抽象工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品类,可以派生出多个具体产品类. 2. 一个抽象工厂类,可以派生出多个具体工厂类. 3. 每个具体工厂类只能创建一个具体产品类的实例. 抽象工厂模式特点: 1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类. 2. 一个抽象工厂类,可以派生出多个具体工厂类. 3. 每个具体工厂类可以创建多个

java设计模式 -------- 创建模式 之 简单工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂模式是最常用的模式,因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a = new A(),工厂模式也是用来创建用来创建实例对象的,所以以后new时要多个心眼,是否可以考虑使用工厂模式. 简单工厂模式又可以分成三种模式: 1) 普通简单工厂模式 2) 多方法简单工厂模式 3) 多静态方法简单工厂模式 普通简单工厂模式: 举例:(简单的

java设计模式 -------- 创建模式 之 工厂方法模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 上节的简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码. 依然用上节的例子,四则运算,采用工厂方法模式,各部分的关系如下图: 工厂方法

java设计模式--创建模式--原型模式

原型模式: 1 原型模式 2 概述 3 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 4 5 适用性 6 1.当一个系统应该独立于它的产品创建.构成和表示时. 7 8 2.当要实例化的类是在运行时刻指定时,例如,通过动态装载. 9 10 3.为了避免创建一个与产品类层次平行的工厂类层次时. 11 12 4.当一个类的实例只能有几个不同状态组合中的一种时. 13 14 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些. 15 16 参与者 17 1.

设计模式--创建模式--原型模式

一.基本概念 1.原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 . 2.角色: A.抽象原型(Prototype)角色:此角色定义了的具体原型类所需的实现的方法,本例子直接精简为类. B.客户(Client)角色:客户类提出创建对象的请求:也就是我们用户使用复制粘贴的功能. 3.其实原型模式的核心就是Prototype(抽象原型),他需要继承Cloneable接口,并且重写Object类中的clone方法即可. 二.简单例子 A.抽象原

java设计模式--创建模式--工厂方法

工厂方法定义: 1 工厂方法 2 3 概述 4 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 5 6 适用性 7 1.当一个类不知道它所必须创建的对象的类的时候. 8 9 2.当一个类希望由它的子类来指定它所创建的对象的时候. 10 11 3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候. 12 参与者 13 1.Product 14 定义工厂方法所创建的对象的接口. 1

JDK 源码 阅读 - 2 - 设计模式 - 创建型模式

A.创建型模式 抽象工厂(Abstract Factory) javax.xml.parsers.DocumentBuilderFactory DocumentBuilderFactory通过FactoryFinder实例化具体的Factory. 使用例子: DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilder

设计模式——创建型模式

简单的说我们可以把23种设计模式可以归为三大类,分别是创建型模式.结构型模式和行为型模式. 今天,首先看一下创建型模式.创建型设计模式包括5种:单例模式(Singleton).工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory).建造者模式(Builder).原型模式(Prototype).  1.单例模式(Singleton)        1)简介 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的软件设计模式.在它的核心结