工厂模式的庐山真面目 Document K Application Document* doc= Create Document( Open Create Document( docs. Add( doc) Close ■■■■■■ New Document( doc -)open O Savel Open Document( Revert My Document… MyApplication ta return new MyDocument Create Document( 大家可以跟先前的问题对应一下: Application: SimplePizzaFactory Document: Pizza store 工厂方法模式定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个。工厂方法 让类把实例化推迟到子类
工厂模式的庐山真面目 Document Open() Close() Save() Revert() return new MyDocument Application CreateDocument() NewDocument() OpenDocument() MyApplication CreateDocument() MyDocument Document* doc=CreateDocument(); docs.Add(doc); doc→Open(); 大家可以跟先前的问题对应一下:Application: SimplePizzaFactory Document: PizzaStore 工厂方法模式定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个。工厂方法 让类把实例化推迟到子类
第二个设计模式,从星巴兹咖啡开始 ●星巴兹是一家扩张速度很快的咖啡店,所以他们打算更新他们的订单系统,以适应新 的情况。原先的设计如下: 这个实例变量,由每个 Beverage(饮料)是一个 Beverage 子类设置,用来描述饮 抽象类,店内所提供的 description 料。利用 getDescription0 饮料都必须继承此类。 方法来返回此描述。 getDescription0 cost cost0方法是抽象的,子 类必须定义自己的实现。 )其它有用方法 Houseblend DarkRoast Decaf Espresso cost( cost( cost( costO 每个子类实现cst来返回饮料的价钱
第二个设计模式,从星巴兹咖啡开始 Beverage description getDescription() cost() //其它有用方法 DarkRoast cost() HouseBlend cost() ⚫星巴兹是一家扩张速度很快的咖啡店,所以他们打算更新他们的订单系统,以适应新 的情况。原先的设计如下: Espresso cost() Decaf cost() Beverage(饮料)是一个 抽象类,店内所提供的 饮料都必须继承此类。 这个实例变量,由每个 子类设置,用来描述饮 料。利用getDescription() 方法来返回此描述。 cost()方法是抽象的,子 类必须定义自己的实现。 每个子类实现cost()来返回饮料的价钱
a huge catastrophe 如果人们买咖啡时要加入一些原料,按原先的设计那就是程序员的 catastrophe。 Beverage description getDescription( cost( )其它有用方法 Darkroast House blend Decaf Espresso cost( costo cost( costo 表中省略了许多原料表格。每个cost(方法将计算出咖啡加上订单上各种调料的价 钱
A huge catastrophe Beverage description getDescription() cost() //其它有用方法 HouseBlend cost() DarkRoast cost() 如果人们买咖啡时要加入一些原料,按原先的设计那就是程序员的catastrophe。 Decaf cost() Espresso cost() 表中省略了许多原料表格。每个cost()方法将计算出咖啡加上订单上各种调料的价 钱
使用继承之后 现在加入子类,每个类代 Beverage 表菜单上的一种饮料: description milk 超类 cost()将计算所有调料的 mocha 价钱,而子类覆盖过的cost0 whip 会扩展超类的功能,把指定的 getDesription costa 饮料类型的价钱也加进来。 hasMilkl setMilki has soy setsoy0 每个cost方法需要计算该 hasMocha 饮料的价线,然后通过调 setMocha( 用超类的 costo实现,加入 hasWhipo) setWhip( 调料的价格。 其他有用的 Houseblend DarkRoast Decaf Espresso cost cost( cost costO
使用继承之后 Beverage description milk soy mocha whip getDesription() cost() hasMilk() setMilk() hasSoy() setSoy() hasMocha() setMocha() hasWhip() setWhip() //其他有用的 方法…… DarkRoast cost() HouseBlend cost() Decaf cost() Espress0 cost() 现在加入子类,每个类代 表菜单上的一种饮料: 超类cost()将计算所有调料的 价钱,而子类覆盖过的cost() 会扩展超类的功能,把指定的 饮料类型的价钱也加进来。 每个cost()方法需要计算该 饮料的价线,然后通过调 用超类的cost()实现 ,加入 调料的价格