日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式之_工厂系列_02

發布時間:2024/4/13 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式之_工厂系列_02 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.learn.abstractfactory;/*** 現在我們假設這么一個東西,這個人不僅開著車,* 還拿著武器,比如說他拿著一把AK47,* 這個人不僅開著Car,手持AK47,* 這個人手上控制的產品非常多,* 他開著Car,手持AK47,嘴里叼著蘋果* 一路哼著歌,奔著東北而去了* 這個人手里頭控制著一系列產品* 如果我想控制這一系列產品的隨時替換,* 我該怎么辦?比如舉個實際點的列子* 你家搞裝修,現在還要賣整體廚房,* 油煙機也是他的,這個地板也是他的,* 熱水器也是他的,微波爐也是他的,* 你能不能做到說把一系列產品替換掉的話就全給替換掉了* 這就好玩了,這件事情該怎么做呢* 其實根據我給大家的例子,* 我是不是有一個工廠一下子可以產生一系列產品* 這樣我在Test里面所有的東西我都不去new他了* @author Leon.Sun**/ public class Test {public static void main(String[] args) {/*** 首先我new一個工廠出來* 如果我想把一系列產品全替換掉的話,* 我只要來一個新的工廠就可以了* 但是現在問題就來了* 我想把DefaultFactory換成MagicFactory* 我所有的產品都會跟著換過來* 下面的方法都要跟著改,太麻煩了* 我不想改下面的方法* 有人說起名字起成一樣的,但是不能再語法上控制他* 如果我們想在語法上控制他,只能寫特定的命名的方法* 我就要產生一個工廠的父類*/// DefaultFactory f = new DefaultFactory();/*** 我用父類引用指向子類對象* 因為MagicFactory是AbstractFactory的子類* 所以我可以這樣去new* 我們在這里new的是MagicFactory* 如果我換成其他系列的產品,簡單我只要換一個地方* 我把MagicFactory改成DefaultFactory* 你會發現你所有的一系列產品都會跟著變了* 而且還有一個好處,如果你對自己的東西不滿意了* 一系列產品你都不滿意,你添加你自己的系列產品* 交通工具從Vehicle繼承* 武器從Weapon繼承* 然后再產生自己的工廠* 你不必修改原來的代碼* 換成自己的系列產品只需要改這么一個地方* 將來我把這個東西寫在配置文件里* 你甚至源代碼都不用變了* 只改配置文件就OK* 類似于這樣的應用非常多* 我相信大家用過換皮膚的軟件* 包括里面的按鈕,什么菜單,對話框都整體的換過來了* 是不是很類似于抽象工程* 抽象工廠是生產了一系列產品,* 如果你想換掉一系列產品的時候,* 或者是想在一系列產品的情況下進行擴展,* 想產生新的系列產品* 以及想對這一系列產品的生產過程進行控制,* 用抽象工廠,* 抽象工廠和我們普通的工廠相比,* 他在哪方面具有長處,* 哪方面又是短處,* 我覺得最關鍵的一點,* 對于我們普通的工廠來說,* 我們是能夠擴展產品的,* 對于普通的工廠來說,我們是可以對產品的維度上來擴展,* 我可以產生新的產品,* 可以產生新的產品的工廠,* 這兩個東西我都可以產生,* 所以我可以在產品這方法進行擴展,* 如果我們普通工廠里面產生產品系列,* 你這個時候會不會很麻煩,* 你肯定會特別麻煩,* 因為你產生新的產品系列,* 你產生Apple,你就的產生AppleFactory,* 你產生MushRoom,你就的產生MushFactory,* 然后你就會發現工廠泛濫,* 最后你就會發現你的工廠類,會不斷的泛濫,* 所以普通的方法工廠來說,最后會產生工廠泛濫這種問題,* 但是對于抽象工廠來說,他也有短處,* 我現在可以換產品系列,可以產生新的產品系列,* 可是我可以產生新的產品品種嗎,比如說我現在想讓這個人帶著盔甲* 盔甲有具體的工廠讓他去產生,這個時候就麻煩了,* 必須讓AbstractFactory去動他的工廠,再加一個方法叫create盔甲* 然后我所有的子類原來實現過的得加上新的方法,有沒有覺得很麻煩,* 所以這兩個都有短處,簡單工廠的短處在什么地方呢,產生產品系列的時候會很麻煩,* 工廠泛濫,而抽象工廠在產生產品系列品種的時候,你要改動的地方也太多,* 能不能把短處給他去掉,把長處給綜合起來,既讓他在產品系列有擴展,* 又能夠在產品的品種方面唯一的確定,可以說天底下沒有那么大的好事,* 很多很多事情那方面好了另一方面就不好,他最后是一個零和游戲,* 反正哪方面多了這方面就少了,沒有特別特別好的解決方案,* 不過Spring本身提供了一種解決方案,Spring本身叫做bean工廠,* 為了測試Spring的Bean工廠,* 在Spring里面有一個工廠叫BeanFactory,他其實是由一些子類來實現的*/// MagicFactory m = new MagicFactory();// AbstractFactory f = new MagicFactory();AbstractFactory f = new DefaultFactory();/*** 要想用的時候把它new出來* * 現在我有一個客戶類* * 然后所有的東西都有Factory來產生*/// Car c = new Car();// Car c = f.createCar();Vehicle v = f.createVehicle();// c.run();v.run();/*** 手持AK47* 讓他去shoot*/// AK47 ak = new AK47();// AK47 ak = f.createAK47();// ak.shoot();/*** 他具體產生什么樣的武器* 要根據他具體的工廠來決定* 只要你的工廠一旦替換掉之后* 我就可以把所有系列的產品全都替換過來*/Weapon w = f.createWeapon();w.shoot();/*** 我還可以讓他去吃蘋果* 然后打印他的名字*/// Apple a = new Apple();// Apple a = f.createApple();Food food = f.createFood();// a.printName();food.printName();}} package com.learn.abstractfactory;/*** Car不去實現任何的接口了,也不管單例了* 這是我們最原始的狀態* @author Leon.Sun**/ public class Car extends Vehicle {public void run() {System.out.println("冒著煙奔跑中car......");}} package com.learn.abstractfactory;/*** 我們具體的子類,比如AK47* 應該是從Weapon繼承* 這樣我們的AK47的工廠createWeapon的方法去產生AK47了* @author Leon.Sun**/ public class AK47 extends Weapon {/*** AK47里面有一個方法*/public void shoot() {System.out.println("噠噠噠......");} } package com.learn.abstractfactory;public class Apple extends Food {/*** 拿到水果的名稱* 簡單起見就打印他的名字*/public void printName() {System.out.println("apple");}} package com.learn.abstractfactory;/*** 由他來產生具體的東西,* 比如他可以產生一個Car,* 他可以產生一系列產品* 讓這兩個具體的Factory從AbstractFactory繼承* @author Leon.Sun**/ public class DefaultFactory extends AbstractFactory {@Overridepublic Vehicle createVehicle() {return new Car();}@Overridepublic Weapon createWeapon() {return new AK47();}@Overridepublic Food createFood() {return new Apple();}// public Car createCar() { // return new Car(); // }/*** 他可以產生槍AK47*/ // public AK47 createAK47() { // return new AK47(); // }/*** 產生食品Apple*/ // public Apple createApple() { // return new Apple(); // }} package com.learn.abstractfactory;/*** 魔法世界的工廠* 既然你是從AbstractFactory繼承* 所以需要去是實現他的方法* 讓他自己來幫我生成* @author Leon.Sun**/ public class MagicFactory extends AbstractFactory {@Overridepublic Vehicle createVehicle() {return new Broom();}@Overridepublic Weapon createWeapon() {return new MagicStick();}/*** 產生毒蘑菇*/@Overridepublic Food createFood() {return new MushRoom();}/*** 他產生的交通工具永遠都是掃帚*/ // public Broom createBroom() { // return new Broom(); // }/*** 由他來產生武器* 魔法世界產生的武器應該叫魔法棒*/ // public MagicStick createMagicStick() { // return new MagicStick(); // }/*** 他還可以產生第三系列的產品* 魔法世界產生的食品蘑菇*/ // public MushRoom createMushRoom() { // return new MushRoom(); // }} package com.learn.abstractfactory;/*** 一個簡單的Broom* @author Leon.Sun**/ public class Broom extends Vehicle {public void run() {System.out.println("一路沙城暴飛奔......");} } package com.learn.abstractfactory;public class MagicStick extends Weapon {@Overridepublic void shoot() {/*** 他射出來的是一個大火球*/System.out.println("fire hu hu hu hu.......");}} package com.learn.abstractfactory;/*** 他應該從Food繼承* @author Leon.Sun**/ public class MushRoom extends Food {@Overridepublic void printName() {System.out.println("MushRoom.......");}} package com.learn.abstractfactory;/*** 抽象工廠* 他當然有產生系列產品的方法* * 我們現在有一大堆的產品* 我們有一個Vehicle交通工具* Food食品,有一個Weapon武器* 然后在他們的下面有一個又一個的子類* 他們下面有子類去實現他* 現在我們一個工廠就能夠產生一系列的產品* 這個工廠很好玩,一下子就能產生好多產品* 他可以產1系列的工廠* 當然我們還有2系列的工廠* 總而言之他可以產生V1,F2,W2* 其實他們兩個是同一個父類* 像類似于這樣一個內結構有什么樣的好處呢* 好處就在于你想替換掉這一系列產品的時候* 你只需要把這一系列產品造出來,同時換掉這個工廠就可以了* 比如我想把1系列的產品替換成2系列的產品* 只需要替換產生工廠就可以了* 你沒有必要所有的東西都自己取new一遍* * @author Leon.Sun**/ public abstract class AbstractFactory {/*** 因為我得根據的工廠產生具體的產品* 所以對于我們來說,這些產品我們也得統一起來* 當然我們也有這方面的經驗了* 統一這些產品建父類就行了* 我就必須創建一個新的抽象的概念出來* 它是用來產生交通工具的* 有什么樣的交通工具由他的子類來決定,* 所以增加了四個抽象概念* 第一個是AbstractFactory* 第二個是Vehicle* 第三個是Weapon* 第四個是Food* 這幾個類都得創建出來* */public abstract Vehicle createVehicle();/*** 產生武器,至于你是魔法世界的武器還是大刀隨便你*/public abstract Weapon createWeapon();/*** 還可以產生食品*/public abstract Food createFood(); } package com.learn.abstractfactory;/*** 作為Vehicle來說* 現在就是面向抽象編程* 有什么好處,替換起來比較方便* 擴展起來比較容易* * @author Leon.Sun**/ public abstract class Vehicle {public abstract void run(); } package com.learn.abstractfactory;/*** 首先class是abstract* @author Leon.Sun**/ public abstract class Weapon {/*** 首先有一個方法shoot* 怎么樣去shoot由子類去決定*/public abstract void shoot(); } package com.learn.abstractfactory;public abstract class Food {/*** 他怎么去print的,與我沒關系* 由子類去決定*/public abstract void printName(); }

?

總結

以上是生活随笔為你收集整理的设计模式之_工厂系列_02的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。