设计模式之禅之工厂模式和抽象工厂模式

工厂模式:定义一个生产对象的接口,有子类决定具体的对象实例初始化!下面咱们对着定义去作,上代码设计模式

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();

    }

}

至此抽象工厂模式也已经完成了!它和工厂模式的区别在于建立对象的时候你不须要知道对象名叫什么,只须要知道你要喜欢见对象的工厂是什么!可是抽象工厂模式不宜扩展,当你要扩展一个对象时,你要改写工厂接口和工厂实现类来完成!工做量比工厂模式要打不少!

 

之后会继续更新其余的设计模式!共勉

相关文章
相关标签/搜索