设计模式学习笔记之工厂模式

工厂模式?

工厂模式有多种,如果概括的想,可以将抽象工厂也算作工厂模式。主要由简单工厂模式,和有所区分的工厂方法模式和抽象工厂模式。

简单工厂模式

即将对象的创建交给工厂来完成,由工厂来完成具体的对象创建的操作。这样的所谓简单工厂模式,其实严格来说并不是一种设计模式,而只是一种编程习惯。

class Square:

    def draw(self):
        print "drawing a square"


class Triangle:

    def draw(self):
        print "drawing a triangle"


class ShapeFactory(object):

    @classmethod
    def createShape(self, shape):
        return {
            'square': Square(),
            'triangle': Triangle()
        }[shape]


if __name__ == "__main__":
    square = ShapeFactory.createShape("square")
    square.draw()

    triangle = ShapeFactory.createShape("triangle")
    triangle.draw()

工厂方法模式

定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
说明:工厂方法模式用来处理对象的创建,让子类来决定创建的对象是什么,于是将创建对象的过程封装。
也就是说,现在我们依然是用工厂来创建对象,但是这个工厂不是具体的,而是一个抽象的工厂,子类实现这个抽象的工厂,所以不同的子类就可以得到不同的工厂,所以相当于把具体实例化的过程推迟到子类,因为不同的工厂得到不同的产品。(在python中因为没有接口的概念,虽然可以用一些模块来代替,但是从语言本身来说,这样做并不是必须的,所以直接得到多个工厂即可,似乎对这个模式并不是很强调)

抽象工厂模式

定义:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
说明:其实抽象工厂模式常常会运用到工厂方法模式,主要是用来处理关于具体工厂的问题。但是抽象工厂模式并不是工厂方法模式,抽象工厂模式主要是采用抽象的工厂来将工厂组合起来,不需要考虑的具体的工厂类型,java中,用抽象的工厂来先定义需要的几种具体工厂,但是实际上具体工厂的实现是由实现了抽象工厂的具体工厂来实现的(这里用到了工厂方法模式),于是就将几种工厂组合在了一起。
python的示例:

class Dog(object):

    def speak(self):
        return "woof"

    def __str__(self):
        return "Dog"


class Cat(object):

    def speak(self):
        return "meow"

    def __str__(self):
        return "Cat"


class CatFactory(object):

    @property
    def pet(self):
        return Cat()

    @property
    def food(self):
        return "cat food"


class DogFactory(object):

    @property
    def pet(self):
        return Dog()

    @property
    def food(self):
        return "dog food"


class PetShop(object):

    def __init__(self, animal_factory=None):
        self._pet_factory = animal_factory

    def show_pet(self):
        pet = self._pet_factory.pet
        print("we have a {}".format(pet))
        print("It says {}".format(pet.speak()))
        print("And we have {}".format(self._pet_factory.food))


if __name__ == "__main__":
    shop = PetShop(DogFactory())
    shop.show_pet()

    another_shop = PetShop(CatFactory())
    another_shop.show_pet()

这里的petshop就相当于一个抽象工厂了,将两种工厂组合在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值