qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          抽象工廠模式

          public interface IMobilePhone {
              
          public void call();
          }

          public class NokiaMPhone implements IMobilePhone{
              
          public void call(){
              }
          }

          public class OppoMPhone implements IMobilePhone{
              
          public void call(){
              }
          }

          public interface IFactory {
              
          public IMobilePhone createNokiaPhone();
              
          public IMobilePhone createOppoPhone();
          }

          public class MobilePhoneFactory implements IFactory{
              
          public IMobilePhone createNokiaPhone(){
                  
          return new NokiaMPhone();
              }
              
          public IMobilePhone createOppoPhone(){
                  
          return new OppoMPhone();
              }
          }

          public class Client {
              
          public static void main(String args[]){
                  IFactory factory 
          = new MobilePhoneFactory();
                  IMobilePhone nokia 
          = factory.createNokiaPhone();
                  IMobilePhone oppo 
          = factory.createOppoPhone();
                  nokia.call();
                  oppo.call();
              }
          }

          就代碼上而言,工廠模式和抽象工廠模式功能上是差不多的。都通過借口遍程實現了比較好的代碼隔離。不同的地方在于factory類的組織。工廠模式對每一個產品均實現一個工廠。而抽象工廠在一個工廠類中建立多個方法返回多種產品。

          本實例需要根據植物園的種類確定植物園的布局, 而植物園的種類有很多,對應的植物園布局也各不相同。在這里假設有3種植物園:蔬菜園,一年生植物園,多年生植物園。這3garden中種植的植物各不相同,體現在程序中即返回不同的關于“植物園布局”的對象。生成植物園的布局是我們的目的,如果把蔬菜園、一年生植物園、多年生植物園看作是3個“產品族”,而某一時刻只需要其中一個產品族。由于每個產品族需要一個生產的工廠,所以生產這3個產品族需要3個工廠,分別是蔬菜園工廠(VegieGarden.java),一年生植物園工廠(AnnualGarden.java),多年生植物園工廠(PerennialGarden.java)。由于這3個工廠都是生產植物園的工廠,每個工廠生產的產品又基本相同(都生產“中心布局”、“邊沿布局”、“陰處布局”3個產品),所以可以抽象一個工廠類(Garden.java),這個工廠類也具備生產“中心布局”、“邊沿布局”和“陰處布局”3個產品的能力,而生產的方法由具體的工廠來實現。這樣,再通過一個總控程序(GardenMaker.java)(這個總控程序也可以放到抽象的工廠中)指定需要調用的具體工廠。

          首先來創建Plant.java類,它只有一個name屬性

          public class Plant {
              String name;

              
          public Plant(String name) {        
                  
          this.name = name;
              }

              
          public String getName() {
                  
          return name;
              }
          }


          然后是Garden類,3個方法分別是得到中心處、邊沿處和陰暗處的植物

          public abstract class Garden {
              
          public abstract Plant getCenter();
              
          public abstract Plant getBorder();
              
          public abstract Plant getShade();
          }

          下面是3個工廠類
          /**
           * 一年生植物園工廠
           * 
          @author Heinvo Lee
           *
           
          */
          public class AnnualGarden extends Garden {

              @Override
              
          public Plant getCenter() {
                  
          // TODO Auto-generated method stub
                  return new Plant("Marigold");//萬壽菊
              }
              
              @Override
              
          public Plant getBorder() {
                  
          // TODO Auto-generated method stub
                  return new Plant("Alyssum");//十字花科植物;庭薺
              }

              @Override
              
          public Plant getShade() {
                  
          // TODO Auto-generated method stub
                  return new Plant("Coleus");//薄荷科植物
              }

          }

          /**
           * 常年生植物園工廠
           * 
          @author Heinvo Lee
           *
           
          */
          public class PerennialGarden extends Garden {



              @Override
              
          public Plant getCenter() {
                  
          // TODO Auto-generated method stub
                  return new Plant("Dicentrum");
              }
              
              @Override
              
          public Plant getBorder() {
                  
          // TODO Auto-generated method stub
                  return new Plant("Sedum");//景天屬植物;八寶
              }

              @Override
              
          public Plant getShade() {
                  
          // TODO Auto-generated method stub
                  return new Plant("Astilbe");//落新婦屬植物
              }

          }

          /**
           * 蔬菜園工廠
           * 
          @author Heinvo Lee
           *
           
          */
          public class VegieGarden extends Garden {

              
          public Plant getCenter() {
                  
          return new Plant("Corn");
                  }
              
          public Plant getBorder() {
                  
          return new Plant("Peas");
                  }
              
              
          public Plant getShade() {        
                  
          return new Plant("Broccoli");//花椰菜
                  }

          }

          接下來創建總控類GardenMaker
          public class GardenMaker {
              
          private Garden garden;
              
          public Garden getGarden(String gtype)
              {
                  garden 
          = new VegieGarden(); //default
              if(gtype.equals("Perennial"))
                  garden 
          = new PerennialGarden();
              
          if(gtype.equals("Annual"))
                  garden 
          = new AnnualGarden();
              
          return garden;
              }
          }

          然后是一個測試類了
          public class Main {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  GardenMaker gm
          =new GardenMaker();
                  Garden vg
          =gm.getGarden("Vegie");
                  Garden ag
          =gm.getGarden("Annual");
                  Garden pg
          =gm.getGarden("Perennial");
                  
                  System.out.println(
          "Vegie garden, center: "+vg.getCenter().getName());
                  System.out.println(
          "Vegie garden, border: "+vg.getBorder().getName());
                  System.out.println(
          "Vegie garden, shade: "+vg.getShade().getName());
                  System.out.println(
          "------------------------------------");
                  System.out.println(
          "Annual garden, center: "+ag.getCenter().getName());
                  System.out.println(
          "Annual garden, border: "+ag.getBorder().getName());
                  System.out.println(
          "Annual garden, shade: "+ag.getShade().getName());
                  System.out.println(
          "------------------------------------");
                  System.out.println(
          "Perennial garden, center: "+pg.getCenter().getName());
                  System.out.println(
          "Perennial garden, border: "+pg.getBorder().getName());
                  System.out.println(
          "Perennial garden, shade: "+pg.getShade().getName());
                  
                  
          // TODO Auto-generated method stub

              }

          }

          執行這個測試類,可以在控制臺看到以下效果(我以紅色標紅)

          Vegie garden, center: Corn
          Vegie garden, border: Peas
          Vegie garden, shade: Broccoli
          ------------------------------------
          Annual garden, center: Marigold
          Annual garden, border: Alyssum
          Annual garden, shade: Coleus
          ------------------------------------
          Perennial garden, center: Dicentrum
          Perennial garden, border: Sedum
          Perennial garden, shade: Astilbe

          從這個例子我看出以下:
            GardenMaker gm=new GardenMaker();
            Garden vg=gm.getGarden("Vegie");
            Garden ag=gm.getGarden("Annual");
            Garden pg=gm.getGarden("Perennial");
          上面4句代碼是測試類里面的

          當需要生產某一種植物園的布局時,只需要將植物園的類型告訴總控程序(GardenMaker.java),這里是傳入參數Vegie、Annual、Perennial,總控程序決定使用生產指定類型植物園的工廠生產出需要的“產品族”,而在此過程中,不需要了解具體工廠中的方法是如何實現的。

          posted on 2011-09-26 11:06 順其自然EVO 閱讀(193) 評論(0)  編輯  收藏

          <2011年9月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 株洲县| 郯城县| 禹城市| 高唐县| 罗甸县| 五指山市| 达拉特旗| 耿马| 井研县| 池州市| 大化| 和田县| 饶平县| 武强县| 阿鲁科尔沁旗| 农安县| 沙湾县| 锦州市| 无锡市| 秭归县| 资阳市| 大姚县| 新田县| 万山特区| 深水埗区| 刚察县| 鲁甸县| 分宜县| 和硕县| 万山特区| 桐城市| 历史| 宜黄县| 安国市| 白河县| 磐安县| 易门县| 凤山市| 鸡东县| 永平县| 云林县|