diff --git a/go/flyweight/main.go b/go/flyweight/main.go new file mode 100644 index 0000000..c7985f9 --- /dev/null +++ b/go/flyweight/main.go @@ -0,0 +1,102 @@ +package main + +import "fmt" + +/* +实例: +汤宝宝开了一家服装租赁店,好多客人来店里租衣服~ +*/ + +// 享元对象 - 服装 +type Clothing struct { + style string + size string + color string +} + +func (c *Clothing) Show() { + fmt.Printf("服装款式:%s,尺码:%s,颜色:%s\n", c.style, c.size, c.color) +} + +// 享元工厂 - 服装店 +type ClothingFactory struct { + clothingPool map[string]*Clothing +} + +func NewClothingFactory() *ClothingFactory { + return &ClothingFactory{ + clothingPool: make(map[string]*Clothing), + } +} + +func (f *ClothingFactory) GetClothing(style, size, color string) *Clothing { + key := style + "-" + size + "-" + color + if clothing, exists := f.clothingPool[key]; exists { + return clothing + } + newClothing := &Clothing{style: style, size: size, color: color} + f.clothingPool[key] = newClothing + return newClothing +} + +func (f *ClothingFactory) ShowStock() { + fmt.Println("\n服装库存:") + for key, clothing := range f.clothingPool { + fmt.Printf("Key: %s -> ", key) + clothing.Show() + } +} + +// 客人 +type Customer struct { + name string + clothing []*Clothing +} + +func NewCustomer(name string) *Customer { + return &Customer{ + name: name, + clothing: []*Clothing{}, + } +} + +func (c *Customer) RentClothing(clothing *Clothing) { + fmt.Printf("%s 租了一件服装: ", c.name) + clothing.Show() + c.clothing = append(c.clothing, clothing) +} + +func (c *Customer) ShowClothing() { + fmt.Printf("\n客人%s租赁的服装有:\n", c.name) + for _, cloth := range c.clothing { + cloth.Show() + } +} + +func main() { + fmt.Println("============= 享元模式 =============") + + factory := NewClothingFactory() + + // 客人1租衣服 + customer1 := NewCustomer("小红") + customer1.RentClothing(factory.GetClothing("连衣裙", "M", "红色")) + customer1.RentClothing(factory.GetClothing("牛仔裤", "L", "蓝色")) + + // 客人2租衣服 + customer2 := NewCustomer("小明") + customer2.RentClothing(factory.GetClothing("连衣裙", "M", "红色")) // 共享同一件连衣裙 + customer2.RentClothing(factory.GetClothing("西裤", "S", "白色")) + + fmt.Println() + + // 显示租赁情况 + customer1.ShowClothing() + customer2.ShowClothing() + + // 显示服装库存 + factory.ShowStock() + + fmt.Println() + fmt.Println("=========== 享元模式结束 ===========") +} diff --git a/python/flyweight/main.py b/python/flyweight/main.py new file mode 100644 index 0000000..e266d91 --- /dev/null +++ b/python/flyweight/main.py @@ -0,0 +1,83 @@ +""" +实例: +汤宝宝开了一家服装租赁店,好多客人来店里租衣服~ +""" + + +class Clothing: + """享元对象 - 服装""" + + style: str + size: str + color: str + + def __init__(self, style: str, size: str, color: str): + self.style = style + self.size = size + self.color = color + + def show(self): + print(f"服装款式: {self.style}, 尺码: {self.size}, 颜色: {self.color}") + + +class ClothingFactory: + """享元工厂 - 服装店""" + + _clothing_pool: dict[str, Clothing] + + def __init__(self): + self._clothing_pool = {} + + def get_clothing(self, style: str, size: str, color: str) -> Clothing: + key = f"{style}-{size}-{color}" + if key not in self._clothing_pool: + self._clothing_pool[key] = Clothing(style, size, color) + return self._clothing_pool[key] + + def show_stock(self): + print("\n服装库存:") + for key, clothing in self._clothing_pool.items(): + print(f"Keys: {key} -> ", end="") + clothing.show() + + +class Customer: + name: str + clothing: list[Clothing] + + def __init__(self, name: str): + self.name = name + self.clothing = [] + + def rent_clothing(self, clothing: Clothing): + self.clothing.append(clothing) + print(f"{self.name} 租了一件服装: ", end="") + clothing.show() + + def show_clothing(self): + print(f"\n客人{self.name} 租赁的服装有:") + for clothing in self.clothing: + clothing.show() + +if __name__ == "__main__": + print("============= 享元模式 =============") + factory = ClothingFactory() + # 客人1租衣服 + customer1 = Customer("小红") + customer1.rent_clothing(factory.get_clothing("连衣裙", "M", "红色")) + customer1.rent_clothing(factory.get_clothing("牛仔裤", "L", "蓝色")) + # 客人2租衣服 + customer2 = Customer("小明") + customer2.rent_clothing(factory.get_clothing("连衣裙", "M", "红色")) + customer2.rent_clothing(factory.get_clothing("西裤", "S", "白色")) + + print() + + # 显示租赁情况 + customer1.show_clothing() + customer2.show_clothing() + + # 显示服装库存 + factory.show_stock() + + print("\n=========== 享元模式结束 ===========") diff --git a/ts/src/flyweight/index.ts b/ts/src/flyweight/index.ts new file mode 100644 index 0000000..53175b5 --- /dev/null +++ b/ts/src/flyweight/index.ts @@ -0,0 +1,96 @@ +/* +实例: +汤宝宝开了一家服装租赁店,好多客人来店里租衣服~ +*/ + +// 享元对象 - 服装 +class Clothing { + private style: string; + private size: string; + private color: string; + + constructor(style: string, size: string, color: string) { + this.style = style; + this.size = size; + this.color = color; + } + + show() { + console.log( + `服装款式: ${this.style}, 尺码: ${this.size}, 颜色: ${this.color}` + ); + } +} + +// 享元工厂 - 服装店 +class ClothingFactory { + private clothingPool: { [key: string]: Clothing }; + + constructor() { + this.clothingPool = {}; + } + + getClothing(style: string, size: string, color: string): Clothing { + const key = `${style}-${size}-${color}`; + if (!this.clothingPool[key]) { + this.clothingPool[key] = new Clothing(style, size, color); + } + return this.clothingPool[key]; + } + + showStock() { + console.log("\n服装库存:"); + for (const key in this.clothingPool) { + console.log(`Key: ${key} ->`); + this.clothingPool[key].show(); + } + } +} + +// 客人 +class Customer { + private name: string; + clothing: Clothing[]; + + constructor(name: string) { + this.name = name; + this.clothing = []; + } + + rentClothing(clothing: Clothing) { + console.log(`${this.name} 租了一件服装.`); + this.clothing.push(clothing); + clothing.show(); + } + + showClothing() { + console.log(`\n客人${this.name}租赁的服装有:`); + this.clothing.forEach((c) => c.show()); + } +} + +(function () { + console.log("============= 享元模式 ============="); + const factory = new ClothingFactory(); + + // 客人1租衣服 + const customer1 = new Customer("小红"); + customer1.rentClothing(factory.getClothing("连衣裙", "M", "红色")); + customer1.rentClothing(factory.getClothing("牛仔裤", "L", "蓝色")); + + // 客人2租衣服 + const customer2 = new Customer("小明"); + customer2.rentClothing(factory.getClothing("连衣裙", "M", "红色")); // 共享同一件连衣裙 + customer2.rentClothing(factory.getClothing("夹克", "XL", "黑色")); + + console.log(); + + // 显示租赁情况 + customer1.showClothing(); + customer2.showClothing(); + + // 显示服装库存 + factory.showStock(); + + console.log("\n=========== 享元模式结束 ==========="); +})();