哪些网站可以在线做动图佛山网红打卡景点大全排名榜
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:20
当前位置: 首页 > news >正文
哪些网站可以在线做动图,佛山网红打卡景点大全排名榜,专门做外国的网站吗,建立网站和推广文章目录 抽象工厂模式场景示例 单例模式场景实现方式 工厂方法模式场景示例 简单工厂模式场景示例 建造者模式场景示例 原型模式场景示例 抽象工厂模式
抽象工厂模式#xff08;Abstract Factory Pattern#xff09;是一种创建型设计模式#xff0c;它提供了一种将一组相关… 文章目录 抽象工厂模式场景示例 单例模式场景实现方式 工厂方法模式场景示例 简单工厂模式场景示例 建造者模式场景示例 原型模式场景示例 抽象工厂模式
抽象工厂模式Abstract Factory Pattern是一种创建型设计模式它提供了一种将一组相关或相互依赖的对象集合起来创建的方式而无需指定它们的具体类。抽象工厂模式可以被看作是工厂方法模式的延伸它不仅创建单一对象而是创建一系列相关对象的家族。 抽象工厂Abstract Factory定义了创建一系列相关对象的方法接口。通常是一个接口或者抽象类。 具体工厂Concrete Factory实现抽象工厂接口负责创建一组具体对象。 抽象产品Abstract Product定义了一组相关产品的接口。通常是一个接口或者抽象类。 具体产品Concrete Product实现了抽象产品接口是抽象工厂所创建的具体对象。
场景 需要创建一组相关或相互依赖的对象如果系统中有一组相关的对象需要同时创建并且它们之间存在一定的依赖关系可以考虑使用抽象工厂模式。这样可以确保创建的对象之间的配合和一致性。 系统中有多个产品族如果系统中有多个产品族且每个产品族的产品有一定的关联性可以使用抽象工厂模式来管理这些产品族。这样可以使得产品族之间的变化和扩展更加容易。 需要独立于具体工厂的创建过程如果系统需要独立于具体工厂的创建过程而只关心产品的组合和表示可以考虑使用抽象工厂模式。这样可以使得系统更加灵活可以方便地切换不同的产品组合。 GUI 库一个图形用户界面GUI库需要创建不同风格的按钮、文本框和下拉框等组件可以使用抽象工厂模式来管理不同风格组件的创建。 操作系统平台一个操作系统平台需要支持不同的文件系统和网络协议可以使用抽象工厂模式来管理不同平台下文件系统和网络协议的创建。 数据库访问一个数据库访问库需要支持不同数据库如 MySQL、PostgreSQL 等的访问可以使用抽象工厂模式来管理不同数据库访问类的创建。
示例
抽象产品 - 按钮
class Button:def click(self):pass# 具体产品 - Windows 风格按钮
class WindowsButton(Button):def click(self):print(Windows 风格按钮被点击)# 具体产品 - Mac 风格按钮
class MacButton(Button):def click(self):print(Mac 风格按钮被点击)# 抽象产品 - 文本框
class TextBox:def input_text(self):pass# 具体产品 - Windows 风格文本框
class WindowsTextBox(TextBox):def input_text(self):print(在 Windows 风格文本框中输入文本)# 具体产品 - Mac 风格文本框
class MacTextBox(TextBox):def input_text(self):print(在 Mac 风格文本框中输入文本)# 抽象工厂
class GUIFactory:def create_button(self):passdef create_textbox(self):pass# 具体工厂 - Windows 风格工厂
class WindowsGUIFactory(GUIFactory):def create_button(self):return WindowsButton()def create_textbox(self):return WindowsTextBox()# 具体工厂 - Mac 风格工厂
class MacGUIFactory(GUIFactory):def create_button(self):return MacButton()def create_textbox(self):return MacTextBox()# 客户端代码
def create_gui(factory):button factory.create_button()textbox factory.create_textbox()return button, textboxdef main():windows_gui create_gui(WindowsGUIFactory())mac_gui create_gui(MacGUIFactory())# 测试windows_button, windows_textbox windows_guiwindows_button.click() # 输出: Windows 风格按钮被点击windows_textbox.input_text() # 输出: 在 Windows 风格文本框中输入文本mac_button, mac_textbox mac_guimac_button.click() # 输出: Mac 风格按钮被点击mac_textbox.input_text() # 输出: 在 Mac 风格文本框中输入文本if name main:main()输出结果
Windows 风格按钮被点击
在 Windows 风格文本框中输入文本
Mac 风格按钮被点击
在 Mac 风格文本框中输入文本单例模式
单例模式是一种创建型设计模式它确保类只有一个实例并提供一个全局访问点。 只有一个实例单例模式确保一个类只有一个实例对象。 全局访问点单例模式提供一个全局访问点使得程序可以访问该实例。
场景 资源共享当希望多个对象共享同一资源时可以使用单例模式。例如数据库连接池就是一个常见的单例模式的应用场景。 控制对象的数量当希望限制类的实例化次数时可以使用单例模式。例如线程池就可以使用单例模式来控制线程的数量。 全局对象当希望在整个系统中使用一个全局对象时可以使用单例模式。例如日志记录器、配置管理器等都可以使用单例模式来实现。
实现方式
懒汉式在第一次调用时创建实例对象。
class Singleton:_instance Nonedef init(self):if Singleton._instance is not None:raise ValueError(An instance of this class already exists)Singleton._instance selfclassmethoddef get_instance(cls):if cls._instance is None:cls._instance cls()return cls._instance# 客户端代码
def main():# 创建两个实例但它们实际上是同一个对象singleton1 Singleton.get_instance()singleton2 Singleton.get_instance()# 打印输出可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif name main:main()饿汉式在类加载时就创建实例对象。
class Singleton:_instance Nonedef new(cls):if cls._instance is None:cls._instance super().new(cls)return cls._instance# 客户端代码
def main():# 创建两个实例但它们实际上是同一个对象singleton1 Singleton()singleton2 Singleton()# 打印输出可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif name main:main()线程安全的单例模式确保在多线程环境下仍然能够正常工作。
import threadingclass Singleton:_instance None_lock threading.Lock()def new(cls):if not cls._instance:with cls._lock:if not cls._instance:cls._instance super().new(cls)return cls._instance# 客户端代码
def main():# 创建两个实例但它们实际上是同一个对象singleton1 Singleton()singleton2 Singleton()# 打印输出可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif name main:main()基于模块使用 Python 模块系统的特性实现单例模式。
singleton_module.py
class Singleton:value Nonedef get_singleton():if Singleton.value is None:Singleton.value Singleton()return Singleton.valueclient.py
import singleton_module# 客户端代码
def main():# 创建两个实例但它们实际上是同一个对象singleton1 singleton_module.get_singleton()singleton2 singleton_module.get_singleton()# 打印输出可以看到两个实例具有相同的内存地址print(singleton1 is singleton2) # 输出: Trueif name main:main()工厂方法模式
工厂方法模式Factory Method Pattern是一种创建型设计模式它定义了一个用于创建对象的接口但将实际创建工作推迟到子类中。这样工厂方法模式允许一个类在不改变其结构的情况下改变它所实例化的具体类。 抽象产品Abstract Product定义了产品的接口是工厂方法所创建对象的基类。 具体产品Concrete Product实现了抽象产品接口的具体对象。 抽象工厂Abstract Factory定义了创建产品的工厂方法的接口。 具体工厂Concrete Factory实现了抽象工厂接口的具体工厂类负责创建具体产品对象。
场景 创建对象的具体类不是事先知道的当一个类需要创建对象的具体类不是在编写代码时就能确定的而是在运行时动态确定时可以使用工厂方法模式。 避免直接依赖于具体类工厂方法模式可以让客户端代码通过接口调用工厂方法来创建对象而不需要直接依赖于具体类从而降低了耦合度。 需要创建一组相关的对象如果系统需要创建一组相关的对象但具体的对象类型由子类决定可以使用工厂方法模式来管理对象的创建。 需要扩展系统功能工厂方法模式符合开闭原则可以方便地扩展系统功能。当需要添加新的具体产品类时只需要添加新的具体工厂类即可不需要修改已有代码。 图形界面库比如在 GUI 库中根据不同的操作系统如 Windows、MacOS、Linux需要创建不同的按钮、文本框等组件对象。 数据库访问类库在数据库访问类库中根据不同的数据库如 MySQL、PostgreSQL、SQLite需要创建不同的连接对象。 日志记录器在日志记录器中根据不同的日志输出目标如控制台、文件、数据库需要创建不同的日志记录器对象。
示例
from abc import ABC, abstractmethod# 抽象产品 - 车
class Car(ABC):abstractmethoddef drive(self):pass# 具体产品 - Toyota 车
class ToyotaCar(Car):def drive(self):print(驾驶 Toyota 车)# 具体产品 - Tesla 车
class TeslaCar(Car):def drive(self):print(驾驶 Tesla 车)# 抽象工厂
class CarFactory(ABC):abstractmethoddef create_car(self):pass# 具体工厂 - Toyota 工厂
class ToyotaFactory(CarFactory):def create_car(self):return ToyotaCar()# 具体工厂 - Tesla 工厂
class TeslaFactory(CarFactory):def create_car(self):return TeslaCar()# 客户端代码
def drive_car(factory):car factory.create_car()car.drive()def main():toyota_factory ToyotaFactory()tesla_factory TeslaFactory()drive_car(toyota_factory) # 输出: 驾驶 Toyota 车drive_car(tesla_factory) # 输出: 驾驶 Tesla 车if name main:main()输出结果
驾驶 Toyota 车
驾驶 Tesla 车简单工厂模式
简单工厂模式Simple Factory Pattern是一种创建型设计模式它提供了一种将对象的创建过程封装起来的方式。在简单工厂模式中有一个工厂类负责根据客户端的需求创建相应的对象而客户端无需知道具体的创建逻辑。
产品Product被创建的对象的基类或接口它定义了产品的通用行为。具体产品Concrete Product实现产品接口的具体对象。工厂类Factory负责创建具体产品的类。客户端通过调用工厂类的方法来创建产品而不直接实例化具体产品类。
场景 对象的创建逻辑相对简单如果对象的创建逻辑比较简单并且不太可能变化可以考虑使用简单工厂模式。这样可以将对象的创建过程封装起来使客户端代码更加简洁。 需要对客户端隐藏对象的创建细节简单工厂模式可以隐藏对象的创建细节客户端只需要知道如何向工厂类提供参数而不需要了解对象是如何创建的。 需要根据不同的条件创建不同类型的对象如果需要根据不同的条件来创建不同类型的对象可以使用简单工厂模式。例如根据用户输入的不同命令创建不同类型的工具对象。 对象的数量较少且稳定如果需要创建的对象数量较少并且这些对象的种类相对稳定不太容易变化可以考虑使用简单工厂模式。
示例
class Car:def init(self, brand):self.brand brandclass CarFactory:def create_car(self, brand):if brand Toyota:return Car(Toyota)elif brand Tesla:return Car(Tesla)else:raise ValueError(未知车辆品牌)def main():# 创建车辆工厂car_factory CarFactory()# 制造丰田车和特斯拉车toyota_car car_factory.create_car(Toyota)tesla_car car_factory.create_car(Tesla)# 打印输出结果print(丰田车品牌:, toyota_car.brand) # 输出: Toyotaprint(特斯拉车品牌:, tesla_car.brand) # 输出: Teslaif name main:main()输出结果
丰田车品牌: Toyota
特斯拉车品牌: Tesla建造者模式
建造者模式Builder Pattern是一种创建型设计模式它的主要目的是将一个复杂对象的构建过程与其表示分离使得同样的构建过程可以创建不同的表示。 产品Product表示被构建的复杂对象。产品类通常包含多个部件不同的建造者可以构建不同的产品对象。 抽象建造者Builder定义了构建产品对象的抽象接口包括创建各个部件的方法。 具体建造者Concrete Builder实现了抽象建造者接口负责构建产品对象的各个部件并将这些部件组装成最终的产品对象。 指挥者Director负责使用建造者对象构建产品对象的方法。指挥者通常包含一个构建方法该方法接收一个建造者对象作为参数然后根据具体的构建过程调用建造者的方法来构建产品对象。
场景 创建复杂对象当一个对象包含多个部分且构建过程比较复杂时可以使用建造者模式。通过将构建过程分解成多个步骤并由不同的建造者负责构建不同的部分可以简化对象的构建过程。 对象的构建过程需要灵活性当需要灵活地控制对象的构建过程并且可以根据不同需求创建不同的表示时可以使用建造者模式。通过定义不同的具体建造者可以创建不同表示的产品对象。 创建对象的过程需要复用当需要复用相同的构建过程来创建不同的对象时可以使用建造者模式。通过复用相同的构建过程可以提高代码的复用性和可维护性。 创建复杂的文档对象例如一个文档对象可能包含标题、正文、图像、表格等多个部分不同类型的文档可能具有不同的部件组成可以使用建造者模式来构建不同类型的文档对象。 创建复杂的菜单对象例如一个菜单对象可能包含多个菜品、饮料、甜点等多个部分可以使用建造者模式来构建不同类型的菜单对象如午餐菜单、晚餐菜单、酒水菜单等。
示例
产品 - 电脑
class Computer:def init(self):self.case Noneself.cpu Noneself.memory Noneself.hard_drive Noneself.graphics_card Nonedef str(self):info (f电脑配置\nf机箱{self.case}\nfCPU{self.cpu}\nf内存{self.memory}\nf硬盘{self.hard_drive}\nf显卡{self.graphics_card})return info# 抽象建造者
class ComputerBuilder:def init(self):self.computer Computer()def build_case(self):passdef build_cpu(self):passdef build_memory(self):passdef build_hard_drive(self):passdef build_graphics_card(self):pass# 具体建造者 - 游戏电脑
class GamingComputerBuilder(ComputerBuilder):def build_case(self):self.computer.case 大型塔式机箱def build_cpu(self):self.computer.cpu i9-9900Kdef build_memory(self):self.computer.memory 32GB DDR4def build_hard_drive(self):self.computer.hard_drive 1TB SSD 2TB HDDdef build_graphics_card(self):self.computer.graphics_card RTX 3080# 指挥者
class Director:def init(self, builder):self.builder builderdef construct_computer(self):self.builder.build_case()self.builder.build_cpu()self.builder.build_memory()self.builder.build_hard_drive()self.builder.build_graphics_card()def get_computer(self):return self.builder.computer# 客户端代码
def main():gaming_builder GamingComputerBuilder()director Director(gaming_builder)director.construct_computer()gaming_computer director.get_computer()print(gaming_computer)if name main:main()输出结果
电脑配置
机箱大型塔式机箱
CPUi9-9900K
内存32GB DDR4
硬盘1TB SSD 2TB HDD
显卡RTX 3080原型模式
原型模式Prototype Pattern是一种创建型设计模式它通过复制现有对象来创建新对象而不是通过实例化新对象。在原型模式中一个原型对象充当了新对象的模板新对象通过复制原型对象来初始化并可以根据需要进行修改。 简化对象创建原型模式通过复制现有对象来创建新对象避免了使用构造函数和初始化参数的复杂性。 提高性能与直接实例化对象相比通过复制现有对象创建新对象通常更快。 允许动态配置对象新对象可以根据需要对原型对象进行修改以满足不同的需求。
场景 对象的创建成本高当对象的创建成本较高或者对象的创建过程比较复杂时可以使用原型模式。通过复制现有对象来创建新对象可以节省创建对象的时间和资源成本。 需要创建多个相似对象当需要创建多个相似但不完全相同的对象时可以使用原型模式。原型模式允许在现有对象的基础上进行修改和定制从而快速创建多个相似对象。 避免构造函数的复杂性当对象的构造函数包含复杂的初始化逻辑或参数时可以使用原型模式来避免构造函数的复杂性。通过复制现有对象来创建新对象可以避免使用构造函数和初始化参数。 需要动态配置对象当需要根据不同的需求动态配置对象时可以使用原型模式。原型模式允许在创建新对象时根据需要对现有对象进行修改和定制从而满足不同的需求。 缓存对象原型模式可以用于缓存已创建的对象避免重复创建相同的对象提高性能和效率。 深拷贝对象原型模式可以用于执行深拷贝操作创建一个与现有对象相同但不同实例的对象。 创建测试数据原型模式可以用于创建测试数据快速创建多个相似但不完全相同的对象用于测试。
示例
import copyclass Prototype:def init(self):self._objects {}def register_object(self, name, obj):self._objects[name] objdef unregister_object(self, name):del self._objects[name]def clone(self, name, **attrs):obj copy.deepcopy(self._objects.get(name))obj.dict.update(attrs)return objclass Car:def init(self):self.make Toyotaself.model Camryself.year 2020def str(self):return f{self.year} {self.make} {self.model}# 客户端代码
def main():prototype Prototype()# 注册原型对象car Car()prototype.register_object(car, car)# 克隆对象并修改属性cloned_car prototype.clone(car, year2021)print(cloned_car) # 输出: 2021 Toyota Camryif name main:main()输出结果
2021 Toyota Camry
相关文章
-
哪些网站可以免费看剧wordpress 载入很慢
哪些网站可以免费看剧wordpress 载入很慢
- 技术栈
- 2026年03月21日
-
哪些网站可以接任务做兼职怎么做局域网asp网站
哪些网站可以接任务做兼职怎么做局域网asp网站
- 技术栈
- 2026年03月21日
-
哪些网站可以接任务做兼职网站文章页301重定向怎么做
哪些网站可以接任务做兼职网站文章页301重定向怎么做
- 技术栈
- 2026年03月21日
-
哪些网站可以找到做海报的素材wordpress怎样建站
哪些网站可以找到做海报的素材wordpress怎样建站
- 技术栈
- 2026年03月21日
-
哪些网站可以做gifwordpress搬家502
哪些网站可以做gifwordpress搬家502
- 技术栈
- 2026年03月21日
-
哪些网站可以做帮助文档全国网站建设汇编
哪些网站可以做帮助文档全国网站建设汇编
- 技术栈
- 2026年03月21日
