TypechoJoeTheme

IT技术分享

统计

简单工厂模式——23种设计模式之创建型模式

2015-06-20
/
0 评论
/
564 阅读
/
正在检测是否收录...
06/20

工厂模式可以动态决定将哪一个类实例化,不必事先知道每次实例化哪个类。主要解决项目中对象的实例化问题,特别是在需要大量实例化对象时,使用工厂模式可以很好的解决问题。

简单工厂模式又叫“静态工厂方法”,是类的创建模式(基于继承实现)。由一个专门的工厂对象决定创建出哪一种产品类的实例。

工厂模式的精髓:将大量共同接口实例化。

一、类图表示

简单工厂模式涉及“工厂角色”(Creator)、“抽象产品(Product)角色” 及“ 具体产品(Concrete Product)角色” 等三个角色。可以根据参数的不同返回不同类的实例

  • ①、抽象产品角色:定义产品共同拥有的接口,在最简单情况下,可简化为一个标识接口。
  • ②、具体产品角色:具体产品,实现Product接口,该模式所创建的任何对象都是这个角色的实例。
  • ③、静态工厂角色:静态方法中含有与应用紧密相关的业务逻辑,在客户端的直接调用下创建产品对象

java-simple-factory-model-1

二、代码示例

1、普通型

定义一个创建对象的类/接口,由这个类来封装实例化对象的行为,将变化的部分放入其中。

/*定义一个接口或者一个抽象类*/

interface A{

    public void method_A();/*需要重写的方法*/

    public void method_B();/*公共相同的方法,需要写实现类*/

}
/*第一个实现类*/

class A1 implements A{

    @Override

    public void method_A(){

        System.out.println("I am A1");

    }

}
/*第二个实现类*/

class A2 implements A{

    @Override

    public void method_A(){

        System.out.println("I am A2");

    }

}
/*定义一个工厂*/

class Factory {

    public static A create(String type){

        A a = null;

        if("A1".equals(type){

            a = new A1();

        }else if("A2".equals(type)){

            a = new A2();

        }

        return a;

    }

}
/*测试用*/

class Test{

    public static void main(Strings[] args){

    A a = Factory.create(type);

    if(a != null){

        a.method_A();

        a.method_B();

    }

}

2、多个方法型

是对普通工厂模式的改进,在普通工厂模式中,如果传递的字符串参数出错,则不能正确创建对象,而多个工厂方法模式可以提供多个工厂方法,分别创建对象。

对上面的Factory进行如下改动

/*定义一个工厂*/

class Factory {

    public static A createA1(){

         return new A1();
    }

    public static A createA2(){

         return new A2();

     }

}

测试类变为:

/*测试用*/

class Test{

    public static void main(Strings[] args){

    A a = Factory.createA1();

        a.method_A();

        a.method_B();

    }

}

三、优缺点分析

1、优点

  • ①、将对象的创建和对象本身业务处理分离可以降低系统的耦合度,实现了对责任的分割。
  • ②、由于工厂方法是静态方法,使用起来很方便,可通过类名直接调用。
  • ③、还可以在调用时将所传入的参数保存在XML等格式的配置文件中,修改参数时无须修改任何Java源代码。
  • ④、当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

2、缺点

  • ①、工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。
  • ②、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  • ③、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,不利于系统的扩展和维护
  • ④、由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

四、应用场景

  • ①、创建的对象较少
  • ②、客户端知道传入什么样的参数
朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/329/(转载时请注明本文出处及文章链接)