笔记:设计模式(3)-Abstract Factory抽象工厂模式
生活随笔
收集整理的這篇文章主要介紹了
笔记:设计模式(3)-Abstract Factory抽象工厂模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
工廠模式的起源
1.變化點在“對象的創建”,因此就封裝“對象創建”;
2.面向接口編程,依賴接口,而非依賴實現。
?
動機(Motivation)
在系統中,經常面臨著“一系列相互以來的對象”的創建工作;同時,由于需求的變化,往往存在更多系列對象的創建工作。如何應對這種變化?如何繞過常規的對象的創建方法(new),提供一種“封裝機制”來避免客戶程序和這種“多系列具體對象創建工作”的緊耦合?這就是我們要說的抽象工廠模式。
?
結構(Structure)
實現(Actionscript code)
//抽象工廠(AbstractFactory) package com.rock506.themes.abstract {import flash.errors.IllegalOperationError;public class AbstractThemeFactory{public function createSubmitButton():SubmitButton{throw new IllegalOperationError("abstract method");return null;}public function createCancelButton():CancelButton{throw new IllegalOperationError("abstract method");return null;}public function createMessageBox():MessageBox{throw new IllegalOperationError("abstract method");return null;}} } //抽象產品A(AbstractProductA) package com.rock506.themes.abstract {import flash.display.Sprite;import flash.errors.IllegalOperationError;public class Panel extends Sprite{public function Panel(){drawSkin();}protected function drawSkin():void{throw new IllegalOperationError("abstract method");}} } //抽象產品B(AbstractProductB) package com.rock506.themes.abstract {import flash.display.Sprite;import flash.errors.IllegalOperationError;public class SubmitButton extends Sprite{public function SubmitButton() {drawSkin();}protected function drawSkin():void{throw new IllegalOperationError("abstract method");}} } //具體產品A1(ConcreteProductA1) package com.rock506.themes.win7 {import com.rock506.themes.abstract.Panel;internal class Win7Panel extends Panel{public function Win7Panel(){super();}protected override function drawSkin():void{trace("draw skin: Win7Panel");}} } //具體產品B1(ConcreteProductB1) package com.rock506.themes.win7 {import com.rock506.themes.abstract.SubmitButton;internal class Win7SubmitButton extends SubmitButton{public function Win7SubmitButton(){super();}protected override function drawSkin():void{trace("draw skin: Win7SubmitButton");}} } //具體工廠(ConcreteFactory) package com.rock506.themes.win7 {import com.rock506.themes.abstract.*;public class Win7ThemeFactory extends AbstractThemeFactory{public override function createSubmitButton():SubmitButton{return new Win7SubmitButton();}public override function createCancelButton():CancelButton{return new Win7CancelButton();}public override function createMessageBox():MessageBox{return new Win7MessageBox();}} } //管理器 package com.rock506 {import com.rock506.themes.abstract.AbstractThemeFactory;import com.rock506.themes.abstract.CancelButton;import com.rock506.themes.abstract.Panel;import com.rock506.themes.abstract.SubmitButton;import flash.display.Sprite;public class ThemeManager{private var _theme:AbstractThemeFactory;public function ThemeManager(theme:AbstractThemeFactory){_theme = theme;}public function BuildMessageBox():Sprite{var sp:Sprite = new Sprite();var panel:Panel = _theme.createMessageBox();var submitButton:SubmitButton = _theme.createSubmitButton();var cancelButton:CancelButton = _theme.createCancelButton();sp.addChild(panel);sp.addChild(submitButton);sp.addChild(cancelButton);return sp;}} } //客戶端 //使用xp主題 //var theme:ThemeManager = new ThemeManager(new XpThemeFactory()); //使用win7主題 var theme:ThemeManager = new ThemeManager(new Win7ThemeFactory()); var messageBox:Sprite = theme.BuildMessageBox(); addChild(messageBox);?
實現要點(notice)
1.如果沒有應對“多系列對象創建”的需求變化,則沒有必要使用抽象工廠模式,這時候使用簡單的靜態工廠完全可以;
2.?系列對象指的是這些對象之間有相互依賴、或作用的關系;
3.抽象工廠模式經常和工廠方法模式共同組合來應對“對象創建”的需求變化;
4.把工廠作為單件,一個應用中一般每個產品系列只需一個具體工廠的實例,因此,工廠通常最好實現為一個單件模式。
??
參考文獻(reference)
《C#面向對象設計模式縱橫談》視頻
http://terrylee.cnblogs.com
?
?
轉載于:https://www.cnblogs.com/rock506/archive/2010/09/21/1825792.html
總結
以上是生活随笔為你收集整理的笔记:设计模式(3)-Abstract Factory抽象工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一个程序,Hello World
- 下一篇: 当Grid的数据源是View时,如何使用