疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java简单工厂模式


 

   

  在生活中,工厂是用来生产产品的。

  设计模式中的工厂是用来生产对象的。在没有简单工厂的模式下,调用者和被调用者直接在代码中产生联系。工厂模式只是把依赖关系转移了,工厂模式的好处是降低耦合,要直接依赖的对象就不直接依赖了(通过接口或者工厂类解耦)。

  问题的提出是:被调用者的类可能发生变化。(因此引入了简单工厂模式)

  简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。

  代码示例:

  如果在没有工厂模式的实现:

  public class FactoryDemo {

  public static void main(String[] args) {

  // 调用者的代码实现里面直接new了被调用者的类

  // 这种实现叫直接依赖关系

  // 如果被调用者发生改变,下面的这些调用代码就会有改变

  ClothDoll cd = new ClothDoll();

  System.out.println(cd.getInfo());

  BarbieDoll bd = new BarbieDoll();

  System.out.println(bd.getInfo());

  }

  }

  class ClothDoll {

  public String getInfo() {

  return "我是布娃娃,我怕脏";

  }

  }

  class BarbieDoll {

  public String getInfo() {

  return "我是芭比娃娃,我美得不可思议";

  }

  }

  如何解决直接依赖关系?

  解决办法:通过工厂模式进行分解,让客户端去依赖对象,而不直接依赖产品。需要引入第三方的类:工厂类。

  简单工厂模式示例代码:

  public class FactoryDemo {

  // 调用者,下面的两个Doll接口的实现类是被调用者

  // 被调用者对象可能发生变化,使用工厂模式使得对象创建的扩展性变差

  // 思想:不让客户端直接依赖被调用者类

  // 中间人:DollFactory

  // 直接new叫耦合(太依赖了!),工厂模式就很好滴做到了解耦

  public static void main(String[] args) {

  // 调用者的代码实现里面直接new了被调用者的类

  // 这种实现叫直接依赖

  // 如果被调用者发生改变,下面的这些调用代码就会有改变

  Doll clothDoll = DollFactory.getInstance("cloth");

  if(clothDoll!=null)

  System.out.println(clothDoll.getInfo());

  Doll barbie = DollFactory.getInstance("barbie");

  if(barbie!=null)

  System.out.println(barbie.getInfo());

  }

  }

  /**

  * 加入的工厂类

  * @author Administrator

  *

  */

  class DollFactory{

  // 获取一个娃娃,思考使用接口的原因

  // 引入接口的主要原因是,返回对象的类型是不确定的,需要用一个统一的接口来表达对象的类型

  public static Doll getInstance(String name){

  // 根据条件生产不同的对象

  if("cloth".equals(name)){

  return new ClothDoll();

  }else if("barbie".equals(name)){

  return new BarbieDoll();

  }

  return null;

  }

  }

  // 生产的娃娃对象

  interface Doll{

  String getInfo();

  }

  class ClothDoll implements Doll {

  public String getInfo() {

  return "我是布娃娃,我怕脏";

  }

  }

  class BarbieDoll implements Doll {

  public String getInfo() {

  return "我是芭比娃娃,我美得不可思议";

  }

  }