设计模式之创建类模式工厂方法模式.docx

上传人:b****2 文档编号:23303779 上传时间:2023-05-16 格式:DOCX 页数:20 大小:178.69KB
下载 相关 举报
设计模式之创建类模式工厂方法模式.docx_第1页
第1页 / 共20页
设计模式之创建类模式工厂方法模式.docx_第2页
第2页 / 共20页
设计模式之创建类模式工厂方法模式.docx_第3页
第3页 / 共20页
设计模式之创建类模式工厂方法模式.docx_第4页
第4页 / 共20页
设计模式之创建类模式工厂方法模式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

设计模式之创建类模式工厂方法模式.docx

《设计模式之创建类模式工厂方法模式.docx》由会员分享,可在线阅读,更多相关《设计模式之创建类模式工厂方法模式.docx(20页珍藏版)》请在冰豆网上搜索。

设计模式之创建类模式工厂方法模式.docx

设计模式之创建类模式工厂方法模式

设计模式之创建类模式——工厂方法模式

工厂方法模式使用的频率非常高,在我们日常的开发中总能见到它的身影。

 

定义:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

工厂方法使一个类的实例化延迟到其子类。

 

通用类图:

 

通用源码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/**

 *抽象产品类

 *@authorAdministrator

 *

 */

public abstract class Product{

 

    //产品类的公共方法

    public void method1(){

        //业务处理逻辑

    }

     

    //抽象方法

    public abstract void method2();

     

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *具体产品类1

 *@authorAdministrator

 *

 */

public class ConcreteProduct1extends Product{

 

    @Override

    public void method2(){

        //业务逻辑处理

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *具体产品类2

 *@authorAdministrator

 *

 */

public class ConcreteProduct2extends Product{

 

    @Override

    public void method2(){

        //业务逻辑处理

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

 *抽象工厂类

 *@authorAdministrator

 *

 */

public abstract class Creator{

 

    /**

     *创建一个产品对象,其输入参数类型可以自行设置

     *通常为String、Enum、Class等,当然也可以为空

     *@param

     *@paramc

     *@return

     */

    public abstract TcreateProduct(Classc);

     

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

 *具体工厂类

 *

 *@authorAdministrator

 *

 */

public class ConcreteCreatorextends Creator{

 

    @Override

    public TcreateProduct(Classc){

        Productproduct=null;

        try {

            product=(Product)Class.forName(c.getName()).newInstance();

        }catch (InstantiationExceptione){

            //TODOAuto-generatedcatchblock

            e.printStackTrace();

        }catch (IllegalAccessExceptione){

            //TODOAuto-generatedcatchblock

            e.printStackTrace();

        }catch (ClassNotFoundExceptione){

            //TODOAuto-generatedcatchblock

            e.printStackTrace();

        }

        return (T)product;

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

 *场景类

 *

 *@authorAdministrator

 *

 */

public class Client{

 

    /**

     *@paramargs

     */

    public static void main(String[]args){

        Creatorcreator=new ConcreteCreator();

        Productproduct=creator.createProduct(ConcreteProduct1.class);

        /*

         *继续业务处理

         */

        product.method1();

    }

 

}

 

工厂方法模式的优点:

1.良好的封装性,代码结构清晰。

一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,降低模块间的耦合。

2.工厂方法模式的扩展性非常优秀。

在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。

3.屏蔽产品类。

这一点非常重要,产品类的实现如何变化,调用者都不需要关系,它只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。

因为产品类的实例化工作是由工厂类负责的,一个产品对象具体由哪一个产品生成是由工厂类决定的。

4.工厂方法模式是典型的解耦框架。

高层模块只需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则,我不需要的就不要去交流;也符合依赖倒置原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换父类也没问题。

 

工厂方法模式的使用场景:

1.工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,到那时需要慎重考虑是否要增加一个工厂类进行管理,增加代码的复杂度。

2.需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。

3.工厂方法模式可以用在异构项目中。

4.可以使用在测试驱动开发的框架下。

 

工厂方法模式的扩展:

 

∙缩小为简单工厂模式

简单工厂模式(SimpleFactoryPattern),也叫做静态工厂模式。

在实际项目中,采用该方法的案例还是比较多的,其缺点是工厂类的扩展比较困难,不符合开闭原则,但它仍然是一个非常实用的设计模式。

类图:

 

通用代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/**

 *抽象产品类

 *@authorAdministrator

 *

 */

public abstract class Product{

 

    //产品类的公共方法

    public void method1(){

        //业务处理逻辑

    }

     

    //抽象方法

    public abstract void method2();

     

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *具体产品类1

 *@authorAdministrator

 *

 */

public class ConcreteProduct1extends Product{

 

    @Override

    public void method2(){

        //业务逻辑处理

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *具体产品类2

 *@authorAdministrator

 *

 */

public class ConcreteProduct2extends Product{

 

    @Override

    public void method2(){

        //业务逻辑处理

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

 *简单工厂模式中的工厂类

 *@authorAdministrator

 *

 */

public class SimpleFactory{

 

    public static TcreateProduct(Classc){

        Productproduct=null;

         

        try {

            product=(Product)Class.forName(c.getName()).newInstance();

        }catch (InstantiationExceptione){

            //TODOAuto-generatedcatchblock

            e.printStackTrace();

        }catch (IllegalAccessExceptione){

            //TODOAuto-generatedcatchblock

            e.printStackTrace();

        }catch (ClassNotFoundExceptione){

            //TODOAuto-generatedcatchblock

            e.printStackTrace();

        }

         

        return (T)product;

    }

     

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/**

 *场景类

 *

 *@authorAdministrator

 *

 */

public class Client{

 

    /**

     *@paramargs

     */

    public static void main(String[]args){

        Productproduct=SimpleFactory.createProduct(ConcreteProduct1.class);

        /*

         *继续业务处理

         */

        product.method1();

    }

 

}

 

∙升级为多个工厂类

多工厂模式中,每一个产品类都对应一个创建类,好处就是创建类的职责清晰,而且结构简单,但是给可扩展性和可维护性带来了一定的影响。

为什么这么说呢?

如果要扩展一个产品类,就需要建立一个相应的工厂类,这样就增加了扩展的难度。

因为工厂类和产品类的数量相同,维护时需要考虑两个对象之间的关系。

当然,在复杂的应用中一般采用多工厂的方法,然后在增加一个协调类,避免调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口。

 

类图:

 

通用代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/**

 *抽象产品类

 *@authorAdministrator

 *

 */

public abstract class Product{

 

    //产品类的公共方法

    public void method1(){

        //业务处理逻辑

    }

     

    //抽象方法

    public abstract void method2();

     

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *具体产品类1

 *@authorAdministrator

 *

 */

public class ConcreteProduct1extends Product{

 

    @Override

    public void method2(){

        //业务逻辑处理

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *具体产品类2

 *@authorAdministrator

 *

 */

public class ConcreteProduct2extends Product{

 

    @Override

    public void method2(){

        //业务逻辑处理

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

/**

 *多工厂模式的抽象工厂类

 *

 *@authorAdministrator

 *

 */

public abstract class AbstractProductFactory{

 

    public abstract ProductcreateProduct();

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *创建Product1的具体工厂类

 *@authorAdministrator

 *

 */

public class Product1Factoryextends AbstractProductFactory{

 

    @Override

    public ProductcreateProduct(){

        return new ConcreteProduct1();

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 *创建Product2的具体工厂类

 *@authorAdministrator

 *

 */

public class Product2Factoryextends AbstractProductFactory{

 

    @Override

    public ProductcreateProduct(){

        return new ConcreteProduct2();

    }

 

}

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/**

 *场景类

 *

 *@authorAdministrator

 *

 */

public class Client{

 

    /**

     *@paramargs

     */

    public static void main(String[]args){

        AbstractProductFactoryproductFactory=new Product1Factory();

        Productproduct=productFactory.createProduct();

        /*

         *继续业务处理

         */

        product.method1();

    }

 

}

 

∙替代单例模式

通过反射方式创建,获得类构造器,然后设计访问权限,生成一个对象,然后提供外部访问,保证内存中的对象唯一。

通过工厂方法模式创建了一个单例对象,在一个项目中可以产生一个单例构造器,所有需要产生单例的类都遵循一定的规则(构造方法是private),然后通过扩展该框架,只要输入一个类型就可以获得唯一的一个实例。

 

类图:

 

通用代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/**

 *负责生成单例的工厂类

 *

 *@authorAdministrator

 *

 */

public class SingletonFactory{

 

    private static Singletonsingleton;

 

    static {

        try {

            Classcl=Class.forName(Singleton.class.getName());

            //获得无参构造

            Constructorconstructor=cl.getDeclaredConstructor();

            //设置无参构造是可访问的

            constructor.setAccessible(true);

            //产生一个实例对象

            singleton=(Singleton)constructor.newInstance();

        }catch (Exceptione){

            //异常处理

        }

    }

 

    public static SingletongetSingleton(){

        return singleton;

    }

 

}

 

∙延迟初始化(Lazyinitialization)

一个对象被消费完毕后,并不立即释放,工厂类保持其初始状态,等待再次被使用。

延迟初始化是工厂方法模式的一个扩展应用。

 

类图:

 

通用代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/**

 *延迟加载的工厂类

 *

 *@authorAdministrator

 *

 */

public class LazyInitFactory{

 

    private static final MapprMap=new HashMap();

 

    public static synchronized ProductcreateProduct(Stringtype)throws Exception{

        Productproduct=null;

 

        //如果Map中已经有这个对象

        if (prMap.containsKey(type)){

            product=prMap.get(type);

        }else {

            if (type.equals("Product1")){

                product=new ConcreteProduct1();

            }else {

                product=new ConcreteProduct2();

            }

            //同时把对象放到缓存容器中

            prMap.put(type,product);

        }

 

        return product;

    }

}

 

延迟加载框架是可以扩展的,例如限制某一个产品类的最大实例化数量,可以通过判断Map中已有对象数量来实现。

延迟加载还可以用在对象初始化比较复杂的情况下,例如硬件访问,涉及多方面的交互,则可以通过延迟加载降低对象的产生和销毁带来的复杂性。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1