Python:设计模式之工厂模式

简介: Python:设计模式之工厂模式

工厂:

表示负责创建其他类型对象的类


优点:

1、松耦合,对象的创建可以独立于类的实现

2、客户端无需了解创建对象的类,但是可以使用它来创建对象。只需要知道需要传递的接口,方法和参数

3、工厂中添加其他类来创建其他类型的对象,无需更改客户端代码

4、工厂可以重用现有对象


分类

1、简单工厂模式

允许接口创建对象,但不会暴露对象的创建逻辑

2、工厂方法模式

允许接口创建对象,但使用哪个类来创建对象,则交由子类决定

3、抽象工厂模式

抽象工厂是一个能创建一系列相关对象,而无需指定/公开具体类的接口,

该模式能够提供其他工厂的对象,在其内部创建对象


简单工厂模式

# -*- coding: utf-8 -*-
from abc import ABC, abstractmethod
class Animal(ABC):
    @abstractmethod
    def say_hi(self):
        pass
class Dog(Animal):
    def say_hi(self):
        print("汪汪汪...")
class Cat(Animal):
    def say_hi(self):
        print("喵喵喵...")
class Factory(object):
    def make_sound(self, animal):
        eval(animal)().say_hi()
if __name__ == '__main__':
    factory = Factory()
    factory.make_sound("Dog")
    factory.make_sound("Cat")
    """
    汪汪汪...
    喵喵喵...
    """

工厂方法模式

1、定义一个接口来创建对象,工厂本身并不负责创建对象,由子类完成

2、工厂方法的创建通过继承而不是实例化完成

3、工厂方法使得设计更加具有可定制性,返回相同的实例或子类,而不是某种类型的对象(类似简单工厂方法)


# -*- coding: utf-8 -*-
from abc import ABC, abstractmethod
# 组件部分
class Section(ABC):
    @abstractmethod
    def describe(self):
        pass
class PersonalSection(Section):
    def describe(self):
        print("PersonalSection")
class AlbumSection(Section):
    def describe(self):
        print("AlbumSection")
class PatentSection(Section):
    def describe(self):
        print("PatentSection")
class PublicationSection(Section):
    def describe(self):
        print("PublicationSection")
# 工厂部分
class Profile(ABC):
    def __init__(self):
        self.sections = []
        self.create_profile()
    @abstractmethod
    def create_profile(self):
        pass
    def show_sections(self):
        for section in self.sections:
            section.describe()
    def add_section(self, section):
        self.sections.append(section)
class LinkedIn(Profile):
    def create_profile(self):
        self.add_section(PersonalSection())
        self.add_section(PatentSection())
        self.add_section(PublicationSection())
class FaceBook(Profile):
    def create_profile(self):
        self.add_section(PersonalSection())
        self.add_section(AlbumSection())
if __name__ == '__main__':
    linkedin = LinkedIn()
    linkedin.show_sections()
    """
    PersonalSection
    PatentSection
    PublicationSection
    """
    facebook = FaceBook()
    facebook.show_sections()
    """
    PersonalSection
    AlbumSection
    """

抽象工厂方法

提供一个接口来创建一系列相关对象,而无需指定具体的类


# -*- coding: utf-8 -*-
from abc import ABC, abstractmethod
class FruitPizza(ABC):
    @abstractmethod
    def prepare(self):
        pass
class MeatPizza(ABC):
    @abstractmethod
    def serve(self):
        pass
class ApplePizza(FruitPizza):
    def prepare(self):
        print("ApplePizza")
class PeachPizza(FruitPizza):
    def prepare(self):
        print("PeachPizza")
class PorkPizza(MeatPizza):
    def serve(self):
        print("PorkPizza")
class BeefPizza(MeatPizza):
    def serve(self):
        print("BeefPizza")
# 抽象工厂
class PizzaFactory(ABC):
    @abstractmethod
    def create_meat_pizza(self):
        pass
    @abstractmethod
    def create_fruit_pizza(self):
        pass
class IndianPizzaFactory(PizzaFactory):
    def create_meat_pizza(self):
        return PorkPizza()
    def create_fruit_pizza(self):
        return ApplePizza()
class USPizzaFactory(PizzaFactory):
    def create_meat_pizza(self):
        return BeefPizza()
    def create_fruit_pizza(self):
        return PeachPizza()
class PizzaStore(object):
    def make_pizza(self):
        for factory in [IndianPizzaFactory(), USPizzaFactory()]:
            meat_pizza = factory.create_meat_pizza()
            fruit_pizza = factory.create_fruit_pizza()
            meat_pizza.serve()
            fruit_pizza.prepare()
if __name__ == '__main__':
    pizza_store = PizzaStore()
    pizza_store.make_pizza()
    """
    PorkPizza
    ApplePizza
    BeefPizza
    PeachPizza
    """


image.png

image.png

总结:

1、简单工厂:可以在运行时根据客户端传入的参数类型来创建相应的实例

2、工厂方法:定义一个接口来创建对象,但是创建对象由子类完成

3、抽象工厂方法:提供一个接口,无需指定具体的类,就能创建一系列相关的对象

相关文章
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
2月前
|
设计模式 监控 算法
Python编程中的设计模式应用与实践感悟###
在Python这片广阔的编程疆域中,设计模式如同导航的灯塔,指引着开发者穿越复杂性的迷雾,构建出既高效又易于维护的代码结构。本文基于个人实践经验,深入探讨了几种核心设计模式在Python项目中的应用策略与实现细节,旨在为读者揭示这些模式背后的思想如何转化为提升软件质量的实际力量。通过具体案例分析,展现了设计模式在解决实际问题中的独特魅力,鼓励开发者在日常编码中积极采纳并灵活运用这些宝贵的经验总结。 ###
|
2月前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践感悟####
本文作为一篇技术性文章,旨在深入探讨Python编程中设计模式的应用价值与实践心得。在快速迭代的软件开发领域,设计模式如同导航灯塔,指引开发者构建高效、可维护的软件架构。本文将通过具体案例,展现设计模式如何在实际项目中解决复杂问题,提升代码质量,并分享个人在实践过程中的体会与感悟。 ####
|
3月前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####
|
3月前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践###
【10月更文挑战第18天】 本文深入探讨了Python编程中设计模式的应用与实践,通过简洁明了的语言和生动的实例,揭示了设计模式在提升代码可维护性、可扩展性和重用性方面的关键作用。文章首先概述了设计模式的基本概念和重要性,随后详细解析了几种常用的设计模式,如单例模式、工厂模式、观察者模式等,在Python中的具体实现方式,并通过对比分析,展示了设计模式如何优化代码结构,增强系统的灵活性和健壮性。此外,文章还提供了实用的建议和最佳实践,帮助读者在实际项目中有效运用设计模式。 ###
32 0
|
3月前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###
|
4月前
|
设计模式
python24种设计模式
python24种设计模式
|
5月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式