简单工厂模式(factory)

     工厂模式是创建模式的一种,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)角色
工厂所创建的具体实例对象

 

*优缺点

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

结构的优化。

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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值