第二天:创建型模式--抽象工厂模式

简介: 第二天:创建型模式--抽象工厂模式

####零、抽象工厂


  • 什么是抽象工厂

抽象工厂设计模式是抽象方法的一种泛化,一个抽象工厂是一组工厂方法,每个工厂方法负责产生不同种类的对象。


####一、身边的例子


  • 生产汽车部件

冲压不同的部件用的机器是相同的。机器装配的模型是可配的,随时改变。

  • django_factory

程序包 django_factory是一个用于在测试中创建Django模型的抽象工厂实现,可用来为支持测试专有属性的模型创建实例。


####二、什么情况下使用


  1. 需要将对象的使用和创建解耦的时候;
  2. 需要提高应用的性能和内存使用率的时候;
  3. 创建对象的代码分布在多个不同的地方,且不仅仅在一个方法中,导致无法跟踪这些对象的时候。


####三、何时使用抽象工厂 / 工厂方法


一开始使用工厂方法,在后期需要许多工厂方法,将创建一系列对象的过程合并在一起形成抽象工厂。抽象工厂有一个优点,在使用工厂方法是从用户视角通常是看不到的,抽象工厂能够通过改变激活的工厂方法动态的改变应用的行为。


####四、应用案例

# 青蛙类
class Frog:
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name
    def interact_with(self, obstacle):
        print('{} the Forg encounters {} and {}!'.format(self, obstacle, obstacle.action()))
# 虫子类
class Bug:
    def __str__(self):
        return 'a bug'
    def action(self):
        return 'eats it'
# 青蛙虫子游戏类
class FrogWorld:
    def __init__(self, name):
        print(self)
        self.player_name = name
    def __str__(self):
        return '\n\n\t----- Forg World ------'
    def make_character(self):
        return Frog(self.player_name)
    def make_obstacle(self):
        return Bug()
# 巫师类
class Wizard:
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name
    def interact_with(self, obstacle):
        print(self)
        print('{} the Wizard battles against {} and {}!'.format(self, obstacle, obstacle.action()))
# 怪兽类
class Ork:
    def __str__(self):
        return 'an evil ork'
    def action(self):
        return 'kills it'
# 巫师世界游戏类
class WizardWorld:
    def __init__(self, name):
        print(self)
        self.player_name = name
    def __str__(self):
        return '\n\n\t------ Wizard World ------'
    def make_character(self):
        return Wizard(self.player_name)
    def make_obstacle(self):
        return Ork()
# 游戏入口类
class GameEnvironment:
    def __init__(self, factory):
        # 创建角色
        self.hero = factory.make_character()
        # 创建障碍物
        self.obstacle = factory.make_obstacle()
    def play(self):
        self.hero.interact_with(self.obstacle)
# 验证输入的年龄
def validate_age(name):
    try:
        age = input('Welcome {}.How old are you ?'.format(name))
        age = int(age)
    except ValueError as err:
        print("Age {} is invalid, please try again...".format(age))
        return (False, age)
    return (True, age)
def main():
    name = input("Hello. What's tour name? ")
    valid_input = False
    while not valid_input:
        valid_input, age = validate_age(name)
    game = FrogWorld if age < 18 else WizardWorld
    environment = GameEnvironment(game(name))
    environment.play()
if __name__ == '__main__':
    main()

源码下载地址:https://gitee.com/bugback/17Tian17SheJiMoShi

目录
相关文章
|
7月前
|
设计模式 Java PHP
php设计模式--简单工厂模式(一)
php设计模式--简单工厂模式(一)
36 0
|
7月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
36 0
|
4月前
|
设计模式 uml
工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结
工厂模式中简单工厂模式、工厂方法模式、抽象工厂模式的分析与总结
|
设计模式
大话设计模式-三种工厂模式(简单工厂、工厂方法、抽象工厂)
大话设计模式-三种工厂模式(简单工厂、工厂方法、抽象工厂)
|
设计模式 Java Spring
设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式
Spring Boot 的学习先告一段落,我们先温习下相关设计模式。我们先学习下简单工厂模式和工厂方法模式。
110 0
设计模式学习04----之简单工厂模式以及工厂方法模式以及抽象工厂模式
|
设计模式 Java
Java设计模式-工厂模式(2)工厂方法模式
Java设计模式-工厂模式(2)工厂方法模式
202 0
Java设计模式-工厂模式(2)工厂方法模式
|
设计模式 Java
Java设计模式-工厂模式(3)抽象工厂模式
Java设计模式-工厂模式(3)抽象工厂模式
171 0
Java设计模式-工厂模式(3)抽象工厂模式
|
设计模式 Oracle Java
【玩转23种Java设计模式】创建型模式篇:工厂方法模式
工厂方法模式,是⼀种创建型设计模式。定义一个用于创建产品的接口,由子类决定生产什么产品。
【玩转23种Java设计模式】创建型模式篇:工厂方法模式
|
设计模式 Java
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
|
设计模式 Java 关系型数据库
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(一)