跳转至

抽象工厂

创建一系列复杂对象

每个工厂生产一套对象

可以给一套系统做限制

有利于产品的一致性

难以支持新种类的抽象产品


抽象产品

class PhoneShell(metaclass=ABCMeta):
    @abstractmethod
    def show_shell(self):
        pass
class CPU(metaclass=ABCMeta):
    @abstractmethod
    def show_cpu(self):
        pass
class OS(metaclass=ABCMeta):
    @abstractmethod
    def show_os(self):
        pass

抽象工厂

class PhoneFactory(metaclass=ABCMeta):

    @abstractmethod
    def make_shell(self):
        pass

    @abstractmethod
    def make_cpu(self):
        pass

    @abstractmethod
    def make_os(self):
        pass

具体产品

class SmallShell(PhoneShell):
    def show_shell(self):
        print('普通手机小手机壳')


class BigShell(PhoneShell):
    def show_shell(self):
        print('普通手机大手机壳')


class AppleShell(PhoneShell):
    def show_shell(self):
        print('苹果手机壳')


class SnapDragonCPU(CPU):
    def show_cpu(self):
        print('骁龙CPU')


class MediaTekCPU(CPU):
    def show_cpu(self):
        print('联发CPU')


class AppleCPU(CPU):
    def show_cpu(self):
        print('苹果CPU')


class Android(OS):
    def show_os(self):
        print('Android系统')


class IOS(OS):
    def show_os(self):
        print('iOS系统')

具体工厂

小米手机
class MiFactory(PhoneFactory):

    def make_cpu(self):
        return SnapDragonCPU()

    def make_os(self):
        return Android()

    def make_shell(self):
        return BigShell()
苹果手机
class IPhoneFactory(PhoneFactory):

    def make_cpu(self):
        return AppleCPU()

    def make_os(self):
        return IOS()

    def make_shell(self):
        return AppleShell()

客户端

class Phone:
    def __init__(self, cpu, os, shell):
        self.cpu = cpu
        self.os = os
        self.shell = shell

    def show_info(self):
        print('手机信息:')
        self.cpu.show_cpu()
        self.os.show_os()
        self.shell.show_shell()
def make_phone(factory):
    cpu = factory.make_cpu()
    os = factory.make_os()
    shell = factory.make_shell()
    return Phone(cpu, os, shell)
# 生成 小米手机
p1 = make_phone(MiFactory())
p1.show_info()

# 生成 苹果手机
p2 = make_phone(IPhoneFactory())
p2.show_info()

角色创建

from abc import ABC, abstractmethod

# 抽象产品类1:武器类,定义所有武器的接口
class Weapon(ABC):
    @abstractmethod
    def attack(self):
        pass

# 抽象产品类2:技能类,定义所有技能的接口
class Skill(ABC):
    @abstractmethod
    def cast(self):
        pass

# 具体产品类:剑,继承自Weapon类,并实现attack方法
class Sword(Weapon):
    def attack(self):
        return "Swinging sword!"  # 剑的攻击方式

# 具体产品类:火球术,继承自Skill类,并实现cast方法
class Fireball(Skill):
    def cast(self):
        return "Casting fireball!"  # 火球术的施放方式

# 具体产品类:弓箭,继承自Weapon类,并实现attack方法
class Bow(Weapon):
    def attack(self):
        return "Shooting an arrow!"  # 弓箭的攻击方式

# 具体产品类:治愈术,继承自Skill类,并实现cast方法
class Heal(Skill):
    def cast(self):
        return "Casting heal!"  # 治愈术的施放方式

# 抽象工厂类:角色工厂类,定义创建武器和技能的接口
class CharacterFactory(ABC):
    @abstractmethod
    def create_weapon(self) -> Weapon:
        pass

    @abstractmethod
    def create_skill(self) -> Skill:
        pass

# 具体工厂类:战士工厂,继承自CharacterFactory,负责创建战士的武器和技能
class WarriorFactory(CharacterFactory):
    def create_weapon(self) -> Weapon:
        return Sword()  # 战士使用剑作为武器

    def create_skill(self) -> Skill:
        return Heal()  # 战士的技能是治愈术

# 具体工厂类:法师工厂,继承自CharacterFactory,负责创建法师的武器和技能
class MageFactory(CharacterFactory):
    def create_weapon(self) -> Weapon:
        return Bow()  # 法师使用弓箭作为武器

    def create_skill(self) -> Skill:
        return Fireball()  # 法师的技能是火球术

# 角色类:表示一个具体的角色,包含武器和技能
class Character:
    def __init__(self, weapon: Weapon, skill: Skill):
        self.weapon = weapon
        self.skill = skill

    def use_weapon(self):
        return self.weapon.attack()

    def use_skill(self):
        return self.skill.cast()

# 工厂方法:用于创建角色对象,并返回该对象
def create_character(factory: CharacterFactory) -> Character:
    weapon = factory.create_weapon()  # 通过工厂创建武器
    skill = factory.create_skill()  # 通过工厂创建技能
    return Character(weapon, skill)  # 返回角色对象

# 客户端代码
# 创建一个战士,并使用其武器和技能
warrior_factory = WarriorFactory()
warrior = create_character(warrior_factory)
print(warrior.use_weapon())  # 输出:Swinging sword!
print(warrior.use_skill())   # 输出:Casting heal!

# 创建一个法师,并使用其武器和技能
mage_factory = MageFactory()
mage = create_character(mage_factory)
print(mage.use_weapon())  # 输出:Shooting an arrow!
print(mage.use_skill())   # 输出:Casting fireball!