下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

python工厂模式实例详解

作者:课课家教育     来源: http://www.kokojia.com点击数:936发布时间: 2016-01-12 14:37:04

标签: python

大神带你学编程,欢迎选课

  工厂方法模式(Factory Method Pattern):

  定义了一个创建对象的接口,但由子类决定要实例化类的哪一个;即通过子类来创建对象。

  原则:

  要依赖抽象,不要依赖具体类。

  案例:

  先解释什么是工厂:

  如果你开一家Pizza店(PizzaStore抽象类)卖各种风味的Pizza(Pizza子类),那么你需要根据客户要求准备相应的Pizza(创建Pizza对象),然后烘烤、切片、包装;

  最简单的做法就是在PizzaStore中根据客户要求(类型判断)创建相应的Pizza对象,然后调用Pizza自身(由Pizza抽象类实现)的烘烤、切片和包装方法;

  但这样的代码缺乏弹性,因为你让一个抽象类去依赖具体的对象;我们可以创建一个工厂来生产Pizza,根据传入的不同类型值返回不同Pizza对象,即从PizzaStore中将创建对象的代码挪到工厂中。但这只是一个编程技巧,并不算模式。

  在工厂方法模式中,我们在PizzaStore中定义一个抽象接口(create_pizza)作为抽象的工厂,而order_pizza是它的客户;将Pizza对象的创建放到PizzaStore子类去解决。

  现有Cheese和Clam两款Pizza,以及NY和Chicago两家分店,每家店的同款Pizza的口味不同——为迎合当地口味做了改进,主要差别来自不同的原材料,因此我们实现四个Pizza类型(NYStyleCheesePizza、NYStyleClamPizza、ChicagoStyleCheesePizza和ChicagoStyleClamPizza),每种使用不同的原材料组合,根据客户所在城市和选择款式我们创建不同的对象;根据工厂方法,我们将对象创建的代码放到PizzaStore子类去实现。

  代码:


 

  [Python] view plaincopy#!/usr/bin/python

  class Pizza:

  name = ""

  dough = ""

  sauce = ""

  toppings = []

  def prepare(self):

  print "Preparing %s" % self.name

  print " dough: %s" % self.dough

  print " sauce: %s" % self.sauce

  print " add toppings:"

  for n in self.toppings:

  print " %s" % n

  def bake(self):

  print "Bake for 25 minutes at 350."

  def cut(self):

  print "Cutting into diagonal slices."

  def box(self):

  print "Put into official box."

  def get_name(self):

  return self.name

  class PizzaStore:

  def order_pizza(self, pizza_type):

  self.pizza = self.create_pizza(pizza_type)

  self.pizza.prepare()

  self.pizza.bake()

  self.pizza.cut()

  self.pizza.box()

  return self.pizza

  def create_pizza(self, pizza_type):

  pass

  class NYStyleCheesePizza(Pizza):

  def __init__(self):

  self.name = "NY Style Cheese Pizza"

  self.dough = "NY Dough"

  self.sauce = "NY Sauce"

  self.toppings.append("NY toopping A")

  self.toppings.append("NY toopping B")

  class ChicagoStyleCheesePizza(Pizza):

  def __init__(self):

  self.name = "Chicago Style Cheese Pizza"

  self.dough = "Chicago Dough"

  self.sauce = "Chicago Sauce"

  sefl.toppings.append("Chicago toopping A")

  def cut(self):

  print "Cutting into square slices."

  class NYStyleClamPizza(Pizza):

  def __init__(self):

  self.name = "NY Style Clam Pizza"

  self.dough = "NY Dough"

  self.sauce = "NY Sauce"

  self.toppings.append("NY toopping A")

  self.toppings.append("NY toopping B")

  class ChicagoStyleClamPizza(Pizza):

  def __init__(self):

  self.name = "Chicago Style Clam Pizza"

  self.dough = "Chicago Dough"

  self.sauce = "Chicago Sauce"

  self.toppings.append("Chicago toopping A")

  def cut(self):

  print "Cutting into square slices."

  class NYPizzaStore(PizzaStore):

  def create_pizza(self, pizza_type):

  if pizza_type == "cheese":

  return NYStyleCheesePizza()

  elif pizza_type == "clam":

  return NYStyleClamPizza()

  else:

  return None

  class ChicagoPizzaStore(PizzaStore):

  def create_pizza(self, pizza_type):

  if pizza_type == "cheese":

  return ChicagoStyleCheesePizza()

  elif pizza_type == "clam":

  return ChicagoStyleClamPizza()

  else:

  return None

  if __name__ == "__main__":

  ny_store = NYPizzaStore()

  chicago_store = ChicagoPizzaStore()

  pizza = ny_store.order_pizza("cheese")

  print "Mike ordered a %s." % pizza.get_name()

  print

  pizza = chicago_store.order_pizza("clam")

  print "John ordered a %s." % pizza.get_name()

  print


 

  输出:


 

  [plain] view plaincopyPreparing NY Style Cheese Pizza

  dough: NY Dough

  sauce: NY Sauce

  add toppings:

  NY toopping A

  NY toopping B

  Bake for 25 minutes at 350.

  Cutting into diagonal slices.

  Put into official box.

  Mike ordered a NY Style Cheese Pizza.

  Preparing Chicago Style Clam Pizza

  dough: Chicago Dough

  sauce: Chicago Sauce

  add toppings:

  NY toopping A

  NY toopping B

  Chicago toopping A

  Bake for 25 minutes at 350.

  Cutting into square slices.

  Put into official box.

  John ordered a Chicago Style Clam Pizza.


 (课课家

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程