當前位置:
首頁 >
设计模式- 创建型模式, 建造者模式(2)
發布時間:2025/3/15
15
豆豆
生活随笔
收集整理的這篇文章主要介紹了
设计模式- 创建型模式, 建造者模式(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java23種設計模式之一,英文叫Builder Pattern。其核心思想是將一個“復雜對象的構建算法”與它的“部件及組裝方式”分離,使得構件算法和組裝方式可以獨立應對變化;復用同樣的構建算法可以創建不同的表示,不同的構建過程可以復用相同的部件組裝方式。
?
# coding: utf-8from enum import Enum import timePizzaProgress = Enum('PizzaProgress', 'queued preparation baking ready') PizzaDough = Enum('PizzaDough', 'thin thick') PizzaSauce = Enum('PizzaSauce', 'tomato creme_fraiche') PizzaTopping = Enum('PizzaTopping', 'mozzarella double_mozzarella bacon ham mushrooms red_onion oregano') STEP_DELAY = 3 # 考慮是示例,單位為秒class Pizza:def __init__(self, name):self.name = nameself.dough = Noneself.sauce = Noneself.topping = []def __str__(self):return self.namedef prepare_dough(self, dough):self.dough = doughprint('preparing the {} dough of your {}...'.format(self.dough.name, self))time.sleep(STEP_DELAY)print('done with the {} dough'.format(self.dough.name))class MargaritaBuilder:def __init__(self):self.pizza = Pizza('margarita')self.progress = PizzaProgress.queuedself.baking_time = 5 # 考慮是示例,單位為秒def prepare_dough(self):self.progress = PizzaProgress.preparationself.pizza.prepare_dough(PizzaDough.thin)def add_sauce(self):print('adding the tomato sauce to your margarita...')self.pizza.sauce = PizzaSauce.tomatotime.sleep(STEP_DELAY)print('done with the tomato sauce')def add_topping(self):print('adding the topping (double mozzarella, oregano) to your margarita')self.pizza.topping.append([i for i in(PizzaTopping.double_mozzarella, PizzaTopping.oregano)])time.sleep(STEP_DELAY)print('done with the topping (double mozzarrella, oregano)')def bake(self):self.progress = PizzaProgress.bakingprint('baking your margarita for {} seconds'.format(self.baking_time))time.sleep(self.baking_time)self.progress = PizzaProgress.readyprint('your margarita is ready')class CreamyBaconBuilder:def __init__(self):self.pizza = Pizza('creamy bacon')self.progress = PizzaProgress.queuedself.baking_time = 7 # 考慮是示例,單位為秒def prepare_dough(self):self.progress = PizzaProgress.preparationself.pizza.prepare_dough(PizzaDough.thick)def add_sauce(self):print('adding the cre?me frai?che sauce to your creamy bacon')self.pizza.sauce = PizzaSauce.creme_fraichetime.sleep(STEP_DELAY)print('done with the cre?me frai?che sauce')def add_topping(self):print('adding the topping (mozzarella, bacon, ham, mushrooms, red onion, oregano) to your creamy bacon')self.pizza.topping.append([t for t in(PizzaTopping.mozzarella, PizzaTopping.bacon,PizzaTopping.ham, PizzaTopping.mushrooms,PizzaTopping.red_onion, PizzaTopping.oregano)])time.sleep(STEP_DELAY)print('done with the topping (mozzarella, bacon, ham, mushrooms, red onion, oregano)')def bake(self):self.progress = PizzaProgress.bakingprint('baking your creamy bacon for {} seconds'.format(self.baking_time))time.sleep(self.baking_time)self.progress = PizzaProgress.readyprint('your creamy bacon is ready')class Waiter:def __init__(self):self.builder = None ## 實例屬性最好寫在__init__里面,哪怕屬性不是在初始化時候綁定或者建立,也有寫個None,聲明一下屬性,否則直接在普通方法生成一個實例屬性,不符合pycharm的pep8。def construct_pizza(self, builder):self.builder = builder[step() for step in (builder.prepare_dough,builder.add_sauce, builder.add_topping, builder.bake)]@propertydef pizza(self):return self.builder.pizzadef validate_style(builders):try:pizza_style = input('What pizza would you like, [m]argarita or [c]reamy bacon? ')builder = builders[pizza_style]()valid_input = Trueexcept KeyError as err:print('Sorry, only margarita (key m) and creamy bacon (key c) are available')return (False, None)return (True, builder)def main():builders = dict(m=MargaritaBuilder, c=CreamyBaconBuilder)valid_input = Falsewhile not valid_input:valid_input, builder = validate_style(builders)print()waiter = Waiter()waiter.construct_pizza(builder)pizza = waiter.pizzaprint()print('Enjoy your {}!'.format(pizza))if __name__ == '__main__':main()?
看代碼先從main函數看起,不是從上往下一行行看,通過。
?waiter在其他例子中通常也會叫director。例如下面。一個產品類,通過把不同的構建者傳給導演類創造不同屬性的產品對象。
?
class Director(object):def __init__(self):self.builder = Nonedef construct_building(self):self.builder.new_building()self.builder.build_floor()self.builder.build_size()def get_building(self):return self.builder.building# Abstract Builder class Builder(object):def __init__(self):self.building = Nonedef new_building(self):self.building = Building()# Concrete Builder class BuilderHouse(Builder):def build_floor(self):self.building.floor = 'One'def build_size(self):self.building.size = 'Big'class BuilderFlat(Builder):def build_floor(self):self.building.floor = 'More than One'def build_size(self):self.building.size = 'Small'# Product class Building(object):def __init__(self):self.floor = Noneself.size = Nonedef __repr__(self):return 'Floor: %s | Size: %s' % (self.floor, self.size)# Client if __name__ == "__main__":director = Director()director.builder = BuilderHouse()director.construct_building()building = director.get_building()print(building)director.builder = BuilderFlat()director.construct_building()building = director.get_building()print(building)?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的设计模式- 创建型模式, 建造者模式(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx 负载均衡tomcat
- 下一篇: 关于WPF中Popup中的一些用法的总结