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