python: Builder Pattern

对于珠宝行业来说,一件成品珠宝(比如钻戒、项链)的制作包含多个固定步骤(选材质、选宝石、镶嵌工艺、刻字、质检),但每个步骤可以有不同的配置(比如材质可选黄金 / 铂金、宝石可选钻石 / 红宝石),非常适合用建造者模式实现。

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:生成器模式 Builder Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:39
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : Jewelry.py
 
# ===================== 1. 产品类:珠宝实体 =====================
class Jewelry:
    """
    珠宝实体类,包含核心属性和业务方法
    """
    def __init__(self):
        """
 
        """
        self.material = None  # 戒托材质
        self.gemstone = None  # 主石(类型+参数)
        self.inlay_craft = None  # 镶嵌工艺
        self.engraving = None  # 刻字内容
        self.quality_check = False  # 质检状态
        self.price = 0.0  # 最终价格
 
    def calculate_price(self):
        """
        业务逻辑:根据属性计算价格(简化版)
        :return:
        """
        # 基础材质价格
        material_price = {"黄金": 500, "铂金": 600, "18K金": 450}[self.material]
        # 宝石价格(钻石按克拉,莫桑石固定价)
        gem_type, gem_carat = self.gemstone.split("-")
        gem_price = 1000 * float(gem_carat) if gem_type == "钻石" else 200 * float(gem_carat)
        # 工艺加价
        craft_price = {"爪镶": 100, "包镶": 150, "槽镶": 200}[self.inlay_craft]
        # 刻字加价(可选)
        engraving_price = 50 if self.engraving else 0
        # 总价
        self.price = material_price + gem_price + craft_price + engraving_price
 
    def __str__(self)->str:
        """
 
        :return:
        """
        return (f"定制钻戒详情:\n"
                f"  戒托材质:{self.material}\n"
                f"  主石:{self.gemstone}\n"
                f"  镶嵌工艺:{self.inlay_craft}\n"
                f"  刻字:{self.engraving if self.engraving else '无'}\n"
                f"  质检状态:{'合格' if self.quality_check else '不合格'}\n"
                f"  最终价格:{self.price}元")
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:40
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryBuilder.py
from abc import ABC, abstractmethod
from Model.Builder.Jewelry import Jewelry
 
 
# ===================== 2. 抽象建造者:定义构建步骤 =====================
class JewelryBuilder(ABC):
    """
    珠宝建造者抽象类,定义定制珠宝的固定步骤
    """
    def __init__(self):
        """
 
        """
        self.jewelry = Jewelry()
 
    @abstractmethod
    def build_material(self):
        """
        步骤1:选择戒托材质
        :return:
        """
        pass
 
    @abstractmethod
    def build_gemstone(self):
        """
        步骤2:选择主石及参数
        :return:
        """
        pass
 
    @abstractmethod
    def build_inlay_craft(self):
        """
        步骤3:选择镶嵌工艺
        :return:
        """
        pass
 
    @abstractmethod
    def build_engraving(self, content=None):
        """
        步骤4:个性化刻字(可选)
        :param content:
        :return:
        """
        pass
 
    @abstractmethod
    def build_quality_check(self):
        """
        步骤5:成品质检
        :return:
        """
        pass
 
    def get_jewelry(self):
        """
        返回最终构建的珠宝对象
        :return:
        """
        # 构建完成后自动计算价格(业务流程)
        self.jewelry.calculate_price()
        return self.jewelry
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:43
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : DiamondRingBuilder.py
from Interface.Builder.JewelryBuilder import JewelryBuilder
 
# ===================== 3. 具体建造者:实现钻戒的构建 =====================
class DiamondRingBuilder(JewelryBuilder):
    """
    钻戒建造者,实现具体的构建步骤"
    """""
    def build_material(self, material="铂金"):
        """
        指定戒托材质,默认铂金
        :param material:
        :return:
        """
        self.jewelry.material = material
 
    def build_gemstone(self, gem_type="钻石", carat=0.5):
        """
        指定主石类型和克拉数,默认0.5克拉钻石
        :param gem_type:
        :param carat:
        :return:
        """
        self.jewelry.gemstone = f"{gem_type}-{carat}"
 
    def build_inlay_craft(self, craft="爪镶"):
        """
        指定镶嵌工艺,默认爪镶
        :param craft:
        :return:
        """
        self.jewelry.inlay_craft = craft
 
    def build_engraving(self, content=None):
        """
        刻字,无内容则不刻
        :param content:
        :return:
        """
        self.jewelry.engraving = content
 
    def build_quality_check(self):
        """
        质检:简化为直接合格(实际业务可加检测逻辑)
        :return:
        """
        self.jewelry.quality_check = True
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:45
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : JewelryDirector.py
 
# ===================== 4. 指挥者:控制构建流程 =====================
class JewelryDirector(object):
    """
    珠宝定制指挥者,负责按固定流程执行构建步骤
    """
    def __init__(self, builder):
        self.builder = builder
 
    def construct_jewelry(self, material, gem_type, carat, craft, engraving=None):
        """
        执行完整的定制流程
        :param material:
        :param gem_type:
        :param carat:
        :param craft:
        :param engraving:
        :return:
        """
        # 严格按业务流程执行步骤
        self.builder.build_material(material)
        self.builder.build_gemstone(gem_type, carat)
        self.builder.build_inlay_craft(craft)
        self.builder.build_engraving(engraving)
        self.builder.build_quality_check()
        return self.builder.get_jewelry()
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:生成器模式 Builder Pattern
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/3/8 12:47
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : BuilderBll.py
from BuilderPattern.JewelryDirector import JewelryDirector
from Interface.Builder.DiamondRingBuilder import DiamondRingBuilder
 
# ===================== 5. 客户端使用示例 =====================
 
class BuilderBll(object):
    """
    生成器模式 Builder Pattern
    """
    def demo(self):
        """
        生成器模式 Builder Pattern
        :return:
        """
        # 1. 创建钻戒建造者
        ring_builder = DiamondRingBuilder()
        # 2. 创建指挥者(把控定制流程)
        director = JewelryDirector(ring_builder)
 
        # 3. 定制第一枚钻戒:铂金+1克拉钻石+包镶+刻字"LOVE"
        ring1 = director.construct_jewelry(
            material="铂金",
            gem_type="钻石",
            carat=1.0,
            craft="包镶",
            engraving="LOVE"
        )
        print("=== 第一枚定制钻戒 ===")
        print(ring1)
 
        print("\n" + "-" * 50 + "\n")
 
        # 4. 定制第二枚钻戒:18K金+0.8克拉莫桑石+槽镶+无刻字
        ring2 = director.construct_jewelry(
            material="18K金",
            gem_type="莫桑石",
            carat=0.8,
            craft="槽镶"
        )
        print("=== 第二枚定制钻戒 ===")
        print(ring2)

调用:

python 复制代码
# encoding: utf-8
# 版权所有 2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述: 设计模式 Design Patterns
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# OS        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  oracle 21c Neo4j
# Datetime  : 2026/2/18 20:58
# User      : geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : main.py
# explain   : 学习
 
import Controller.CheckPatterns
 
 
def select_design_pattern() -> tuple[int, Controller.CheckPatterns.DesignPattern | None]:
    """
    返回 (序列号, 选中的枚举对象),退出则返回 (0, None)
    :return:
    """
    print("\n=== 方式3:用户选择展示 ===")
    print("可选设计模式(输入0或q退出):")
    for idx, pattern in enumerate(Controller.CheckPatterns.DesignPattern, 1):
        print(f"{idx}. {pattern._name_to_cn(pattern.name)}({pattern.name})")
    print("0. 退出")
 
    while True:
        user_input = input("\n请输入序号选择要展示的设计模式(输入0/q退出):").strip()
        if user_input in ("0", "q", "Q"):
            print("👋 退出选择流程")
            return (0, None)
 
        try:
            choice = int(user_input)
            if 1 <= choice <= len(Controller.CheckPatterns.DesignPattern):
                selected_pattern = list(Controller.CheckPatterns.DesignPattern)[choice - 1]
                print(f"✅ 你选择了序号:{choice}(对应{selected_pattern._name_to_cn(selected_pattern.name)})")
                return (choice, selected_pattern)  # 返回(序列号, 枚举对象)
            else:
                print(f"❌ 输入无效!请输入1-{len(Controller.CheckPatterns.DesignPattern)}之间的数字,或0/q退出")
        except ValueError:
            print("❌ 输入无效!请输入数字序号,或0/q退出")
 
def ask_continue() -> bool:
    """
    询问用户是否继续选择,返回True(继续)/False(退出)
    """
    while True:
        user_choice = input("\n是否继续选择其他设计模式?(y/n):").strip().lower()
        if user_choice == "y":
            return True
        elif user_choice == "n":
            print("👋 感谢使用,程序结束!")
            return False
        else:
            print("❌ 输入无效!请输入 y(继续)或 n(退出)")
 
 
if __name__ == '__main__':
 
    # 方式1:用户输入选择展示(交互版)
    '''
    print("\n=== 方式1:用户选择展示 ===")
    print("可选设计模式:")
    for idx, pattern in enumerate( bll.CheckPatterns.DesignPattern, 1):
        print(f"{idx}. {pattern._name_to_cn(pattern.name)}({pattern.name})")
 
    try:
        choice = int(input("\n请输入序号选择要展示的设计模式:"))
        selected_pattern = list( bll.CheckPatterns.DesignPattern)[choice - 1]
        selected_pattern.show_example()
    except (ValueError, IndexError):
        print("❌ 输入无效,请输入正确的序号!")
    '''
    # 2
 
    print("🎉 设计模式示例展示程序")
    while True:
        # 1. 选择设计模式
        selected_num, selected_pattern = select_design_pattern()
 
        # 2. 判断是否直接退出(输入0/q)
        if selected_num == 0:
            print("👋 程序结束!")
            break
 
        # 3. 执行选中的示例
        selected_pattern.show_example()
        print(f"\n📌 本次选择的序列号是:{selected_num}")
 
        # 4. 询问是否继续
        if not ask_continue():
            break  # 用户选择不继续,终止循环
 
    print('hi,welcome geovindu.')

输出:

相关推荐
不懒不懒2 小时前
【零基础入门 PyTorch:实现食物图片分类任务】
人工智能·pytorch·python
喵手2 小时前
Python爬虫实战:从天气抓取到机器学习预测气温!
爬虫·python·机器学习·爬虫实战·预测气温·零基础python爬虫教学·天气采集
蜜獾云2 小时前
设计模式之中介者模式:让互相调用的模块之间解耦合
microsoft·设计模式·中介者模式
猿饵块2 小时前
python--sys
开发语言·python
故河2 小时前
Python工具:Conda 包管理器
开发语言·python·conda
Dontla2 小时前
安装Miniconda安装(Windows)、conda虚拟环境创建、conda虚拟环境激活
windows·python
亦复何言??2 小时前
ROS2 节点使用 Conda 环境运行 Python 依赖的解决方案
开发语言·python·conda
absunique3 小时前
算法设计模式看编程思维的抽象能力的技术6
算法·设计模式
蜜獾云3 小时前
设计模式之构造器模式:封装复杂对象的构造逻辑
java·开发语言·设计模式