【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

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

原创 2016年05月30日 22:50:49

工厂模式?

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

简单工厂模式

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

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就相当于一个抽象工厂了,将两种工厂组合在一起。

版权声明:转载请保留出处 举报

相关文章推荐

#Android设计模式学习笔记(抽象工厂模式)

Android设计模式学习笔记(抽象工厂模式)注:该学习笔记来源于《Android 源码设计模式解析与实战》一书,请喜欢的读者购买正版书籍,若觉得本文侵权请博客上留言,马上处理介绍抽象工厂模式与简单工...

设计模式之简单工厂模式学习

学习C++有一两年了,面向对象思想也有所接触。使用过MFC以及OSG类库进行过开发,无非就是调用别人设计好的类库,要说自己使用面向对象的思想去开发程序,这个还真没有。 意识到自己在这方面的匮乏,开始学习设计模式。教材选用《大

java设计模式学习笔记之计算器中的简单工厂模式

java设计模式学习笔记之计算器中的简单工厂模式 最近在重温设计模式,偶然看到程杰的《大话设计模式》写的非常不错、通俗易懂,之后的一系列都是学习的笔记,仅此记录。 一、情景回放:某校大二软件工程专...

HeadFirst 设计模式学习笔记4--工厂模式

1.我们在前边提到一个原则就是“面向接口而不要面向实现编程”,但是我们一直在使用Duck duck = new

Head First 设计模式学习笔记(4)---工厂模式

Head First 设计模式学习笔记(4)---工厂模式 简单工厂模式:  问题1:使用new操作符来制造对象,从OO看,这样会产生什么问题?回答1:我们有一条设计原则是针对接口编程,不要针对实现编...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)