做外贸的零售网站,优化网站平台,网站备案最快多久,怎么做物流网站Python与设计模式–抽象工厂模式
一、快餐点餐系统
想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上#xff0c;有三类可以选择的上餐品#xff1a;汉堡等主餐、小食、饮料。当我们选择好自己需要的食物#xff0c;支付完成后#xff0…Python与设计模式–抽象工厂模式
一、快餐点餐系统
想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上有三类可以选择的上餐品汉堡等主餐、小食、饮料。当我们选择好自己需要的食物支付完成后订单就生成了。下面我们用今天的主角--
工厂模式--来生成这些食物的逻辑主体。
首先来看主餐的生成仅以两种汉堡为例。
class Burger():nameprice0.0def getPrice(self):return self.pricedef setPrice(self,price):self.pricepricedef getName(self):return self.name
class cheeseBurger(Burger):def __init__(self):self.namecheese burgerself.price10.0
class spicyChickenBurger(Burger):def __init__(self):self.namespicy chicken burgerself.price15.0其次是小食。内容基本一致
class Snack():name price 0.0type SNACKdef getPrice(self):return self.pricedef setPrice(self, price):self.price pricedef getName(self):return self.nameclass chips(Snack):def __init__(self):self.name chipsself.price 6.0class chickenWings(Snack):def __init__(self):self.name chicken wingsself.price 12.0class Beverage():name price 0.0type BEVERAGEdef getPrice(self):return self.pricedef setPrice(self, price):self.price pricedef getName(self):return self.nameclass coke(Beverage):def __init__(self):self.name cokeself.price 4.0class milk(Beverage):def __init__(self):self.name milkself.price 5.0以上的BurgerSnackBeverage都可以认为是该快餐店的产品由于只提供了抽象方法 我们把它们叫抽象产品类而cheese burger等6个由抽象产品类衍生出的子类叫作具体产品类。 接下来“工厂”就要出现了。
class foodFactory():typedef createFood(self,foodClass):print self.type, factory produce a instance.foodInsfoodClass()return foodIns
class burgerFactory(foodFactory):def __init__(self):self.typeBURGER
class snackFactory(foodFactory):def __init__(self):self.typeSNACK
class beverageFactory(foodFactory):def __init__(self):self.typeBEVERAGE同样foodFactory为抽象的工厂类而burgerFactorysnackFactorybeverageFactory为具体的工厂类。 在业务场景中工厂模式是如何“生产”产品的呢
if __name____main__:burger_factoryburgerFactory()snack_factorrysnackFactory()beverage_factorybeverageFactory()cheese_burgerburger_factory.createFood(cheeseBurger)print cheese_burger.getName(),cheese_burger.getPrice()chicken_wingssnack_factorry.createFood(chickenWings)print chicken_wings.getName(),chicken_wings.getPrice()coke_drinkbeverage_factory.createFood(coke)print coke_drink.getName(),coke_drink.getPrice()可见业务中先生成了工厂然后用工厂中的createFood方法和对应的参数直接生成产品实例。 打印结果如下 BURGER factory produce a instance. cheese burger 10.0 SNACK factory produce a instance. chicken wings 12.0 BEVERAGE factory produce a instance. coke 4.0
二、工厂模式、简单工厂模式、抽象工厂模式
工厂模式的定义如下定义一个用于创建对象的接口让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。其通用类图如下。其产品类定义产品的公共属性和接口工厂类定义产品实例化的“方式”。
在上述例子中工厂在使用前必须实例化。如果把工厂加个类方法写成如下形式
class simpleFoodFactory():classmethoddef createFood(cls,foodClass):print Simple factory produce a instance.foodIns foodClass()return foodIns在场景中写成如下形式
spicy_chicken_burgersimpleFoodFactory.createFood(spicyChickenBurger)
这样省去了将工厂实例化的过程。这种模式就叫做简单工厂模式。
还是在上述例子中createFood方法中必须传入foodClass才可以指定生成的food实例种类如果将每一个细致的产
品都建立对应的工厂如cheeseBurger建立对应一个cheeseBurgerFactory这样生成食物时foodClass也不必指
定。事实上此时burgerFactory就是具体食物工厂的一层抽象。这种模式就是抽象工厂模式。三、工厂模式的优点和应用
工厂模式、抽象工厂模式的优点
1、工厂模式巨有非常好的封装性代码结构清晰在抽象工厂模式中其结构还可以随着需要进行更深或者更浅的抽象层级调整非常灵活
2、屏蔽产品类使产品的被使用业务场景和产品的功能细节可以分而开发进行是比较典型的解耦框架。工厂模式、抽象工厂模式的使用场景
1、当系统实例要求比较灵活和可扩展时可以考虑工厂模式或者抽象工厂模式实现。比如
在通信系统中高层通信协议会很多样化同时上层协议依赖于下层协议那么就可以对应建立对应层级的抽象工厂根据不同的“产品需求”去生产定制的实例。四、工厂类模式的不足
1、工厂模式相对于直接生成实例过程要复杂一些所以在小项目中可以不使用工厂模式
2、抽象工厂模式中产品类的扩展比较麻烦。毕竟每一个工厂对应每一类产品产品扩展就意味着相应的抽象工厂也要扩展