简单工厂模式(factory)

    技术2022-05-11  7

         工厂模式是创建模式的一种,Java程序系统可以说是随处可见。为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如Bird bird = new Bird() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然使用工厂可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

     

       简单示例:简单打印动物类的功能(每个版本中类的个数可能会不一样,在老的版本中出现的类却在新的版本中没有出现,则说明该类没有发生变化)

     

    版本一:最原始的做法(相当于原始社会,调用者自己去new被调用者)

    package com.zhmg.pattern;

     

    public class Main {

        public static void main(String []args){

          

           /**

            * 创建鸟的实例,并调用相关函数

            */

           Bird bird = new Bird();

           bird.get();

          

           /**

            * 创建猪的实例,并调用相关函数

            */

          

           Pig pig = new Pig();

           pig.get();

        }

    }

     

                 

     

    package com.zhmg.pattern;

     

    public class Bird {

        public void get(){

          

           System.out.println("这是定义鸟的类");

            

        }

     

    }

     

     

    package com.zhmg.pattern;

     

    public class Pig {

     

        public void get(){

          

           System.out.println("这是定义猪的类");

          

        }

    }

     

     

    版本二:使用接口(相当于原始社会中有了一些谋生经验)

    package com.zhmg.pattern;

     

    public interface Animal {

     

        public void get();

    }

     

     

    package com.zhmg.pattern;

     

    public class Pig implements Animal {

     

        public void get(){

          

           System.out.println("这是定义猪的类");

          

        }

    }

     

     

    package com.zhmg.pattern;

     

    public class Bird implements Animal{

        public void get(){

          

           System.out.println("这是定义鸟的类");

            

        }

     

    }

     

     

    package com.zhmg.pattern;

     

    public class Main {

        public static void main(String []args){

                 

           Animal bird = new Bird();

           bird.get();

          

           Animal pig = new Pig();

           pig.get();

        }

    }

     

     

    版本三:使用动态工厂,增加一个工厂类、修改主函数(相当于进入工业社会了)

    package com.zhmg.pattern;

     

    public class AnimalFactory {

     

        //生产一个Bird实例返回

        public Animal getBird(){

          

           return new Bird();

          

        }

        //生产一个Pig实例返回

        public Animal getPig(){

          

           return new Pig();

          

        }

    }

     

     

    package com.zhmg.pattern;

     

    public class Main {

        public static void main(String []args){

                 

           //--------------使用动态工厂-----------------------

          

           AnimalFactory factory = new AnimalFactory();

           Animal bird = factory.getBird();

           Animal pig = factory.getPig();

          

           bird.get();

           pig.get();

          

        }

    }

     

     

    使用静态工厂(修改工厂类、修改主函数),方便调用-----直接使用类名.方法名的方式

     

    package com.zhmg.pattern;

     

    public class AnimalFactory {

     

        //生产一个Bird实例返回

        public static Animal getBird(){

          

           return new Bird();

          

        }

        //生产一个Pig实例返回

        public static Animal getPig(){

          

           return new Pig();

          

        }

    }

     

     

    package com.zhmg.pattern;

     

    public class Main {

        public static void main(String []args){

                 

           //--------------使用静态工厂-----------------------

          

          

           Animal bird = AnimalFactory.getBird();

           Animal pig = AnimalFactory.getPig();

          

           bird.get();

           pig.get();

          

        }

    }

     

     

    版本四:每当再增加动物的时候还需要写getXX()方法

    package com.zhmg.pattern;

     

    public class AnimalFactory {

     

        public static Animal get(String classType) throws InstantiationException, IllegalAccessException {

     

           if ("Bird".equalsIgnoreCase(classType)) {

              

                  return Bird.class.newInstance();

     

           } else if ("Pig".equalsIgnoreCase(classType)) {

              

                  return Pig.class.newInstance();

              

           } else {

              

               System.out.println("未能找到匹配的类型");

              

               return null;

       

           }

        }

    }

     

     

    package com.zhmg.pattern;

     

    public class Main {

       public static void main(String []args) throws InstantiationException, IllegalAccessException{

          

           //------------使用静态工厂-------------------------

           Animal bird = AnimalFactory.get Animal ("bird");

           Animal pig  = AnimalFactory.get Animal ("pig");

          

           bird.get();

           pig.get();

        }

    }

     

     

     

    总结:

     

    *简单工厂,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

    *简单工厂中的角色及职责:

    1.工厂(Creator)角色

    核心,负责实现创建所有实例。工厂类可以被外界直接调用,创建所需的产品对象。

    2.抽象(Product)角色工厂所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

    3.具体产品(Concrete Product)角色工厂所创建的具体实例对象

     

    *优缺点

    在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系

    结构的优化。

    不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以高内聚方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

     

     


    最新回复(0)