設計模式之禪之工廠模式和抽象工廠模式

工廠模式:定義一個生產對象的接口,有子類決定具體的對象實例初始化!下面咱們對着定義去作,上代碼設計模式

1、定義一個生產對象的接口ide

public interface CreateModelFactory{函數

    public static  <T extends GenericModel> T createModel(Class<T> c);測試

}this

2、定義一個對象接口或者是父類(依賴倒置原則).net

public interface GenericModel{設計

    //公共方法對象

    public void show();繼承

}接口

3、定義兩個實現類一、寶馬二、奔馳

public class BMWModel implements GenericModel{

    private BMWModel (){//禁止new建立對象

    }

       @override

    public void show(){

           System.out.println("我是寶馬");

     }

}

public class BENZModel implements GenericModel{

    private BMWModel (){//禁止new建立對象

    }

       @override

    public void show(){

           System.out.println("我是奔馳");

     }

}

四:定義工廠實現類

public class CreateModelFactoryImpl implements CreateModelFactory{

    GenericModel genericModel = null;

     public static <T extends GenericModel> T createModel(Class<T> c){

        try{

        //此處利用反射原理實現累的初始化

        Class clzz = Class.forName(c.getName());//獲取class對象的實體名稱

        Constructor cons = clzz.getDeclaredConstructor();//獲取無參的私有構造函數

        cons.setAccessible(true);//設置私有構造函數能夠訪問

       genericModel = (GenericModel )cons.newInstance();//實例化對象而且強轉爲父類(里氏替換原則)

        }catche(Exception e){

            //異常處理

        }

    }

}

5、生產對象測試類

public class Client{

    public static void main(String[] args){

         GenericModel bmw = CreateModelFactoryImpl .createModel(BMWModel.class);

            bmw .show();

         GenericModel benz= CreateModelFactoryImpl .createModel(BENZModel.class);

            benz.show();

    }

}

至此一個完整的工廠模式已經搭建好了,工廠模式要求頂層使用工廠模式的時候並不須要關心具體的類的初始化過程,只須要知道咱們要初始化的類名便可,把他傳給工廠就能夠生產出來!而且擴展性很好,即使是咱們要增長一個實體類,只須要繼承咱們的頂層接口,工廠不用作任何改變就能生產出來咱們新增的對象!

 

抽象工廠:爲一組相互依賴或者有聯繫的對象定義一個接口,無需指定具體的類是誰要生產!

仍是以上面的爲例子,車都有顏色白色的寶馬,黑色的寶馬,紅色的奔馳,黑色的奔馳

一:定義一個抽象的頂級實體類接口

public interface GenericModel{

    public void show();

    public void colorInfo();

}

二:定義抽象商品類

public abstract class BENZmodel implements GenericModel{//奔馳抽象類

    public void show(){

          System.out.println("我是奔馳");

    }

}

public abstract class BMWmodel implements GenericModel{//寶馬抽象類

    public void show(){

          System.out.println("我是寶馬");

    }

}

三:定義實體類

public class RedBMWModel extends BMWmodel{//紅寶馬

    public RedBMWModel (){

          this.show();

           this.colorInfo();

      }

    public void colorInfo(){

        System.out.println("紅顏色");

    } 

}

 

public class BlackBMWModel extends BMWmodel{//黑寶馬

    public BlackBMWModel (){

           this.show();

           this.colorInfo();

      }

    public void colorInfo(){

        System.out.println("黑顏色");

    } 

}

 

public class RedBENZModel extends BENZmodel {//紅奔馳

    public RedBENZModel (){

           this.show();

           this.colorInfo();

      }

    public void colorInfo(){

        System.out.println("紅顏色");

    } 

}

 

public class BlackBENZModel extends BENZmodel {//黑奔馳

     public BlackBENZModel (){

           this.show();

           this.colorInfo();

      }

    public void colorInfo(){

        System.out.println("黑顏色");

    } 

}

四:建立工廠抽象類

public interface FactoryInter{

    public static void createRedBENZ();

    public static void createBlackBENZ();

    public static void createRedBWM();

    public static void createBlackBWM();

}

五:工廠實現類

public class FactoryInterImpl{

    public static void createRedBENZ(){

        return new RedBENZModel();

    }

    public static void createBlackBENZ(){

        return new BlackBENZModel();

    }

    public static void createRedBWM(){

        return new RedBMWModel ();

    }

    public static void createBlackBWM(){

        return new BlackBMWModel ();

    }

  }

六:測試類

public class Client{

    public static void main(String[] args){

         GenericModel redBmw= FactoryInterImpl.createRedBWM();

         GenericModel blackBmw= FactoryInterImpl.createBlackBWM();

         GenericModel redBenz= FactoryInterImpl.createRedBENZ();

         GenericModel blackBenz= FactoryInterImpl.createBlackBENZ();

    }

}

至此抽象工廠模式也已經完成了!它和工廠模式的區別在於建立對象的時候你不須要知道對象名叫什麼,只須要知道你要喜歡見對象的工廠是什麼!可是抽象工廠模式不宜擴展,當你要擴展一個對象時,你要改寫工廠接口和工廠實現類來完成!工做量比工廠模式要打不少!

 

之後會繼續更新其餘的設計模式!共勉

相關文章
相關標籤/搜索