疯狂java


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

java设计模式之工厂模式


 

  工厂模式:属于创建型模式。同我们生活中的厂家很相似。我们并不自己制造(new)产品,而是依靠厂家制造,我们只是拿来使用。简单的说就是让工厂

  根据我们的需求给我们new一个对象。

  工厂模式又分为工厂方法模式和抽象工厂模式。工厂方法模式又分为:普通工厂方法,静态工厂方法.

  package com.pattern.build.facotry.simple;

  /**

  * 水果接口

  * @author chuer

  * @date 2014-7-24 下午6:15:44

  * @version V1.0

  */

  public interface Fruit {

  public void name(); //水果名称

  }

  package com.pattern.build.facotry.simple;

  /**

  * 苹果

  * @author chuer

  * @date 2014-7-24 下午6:16:08

  * @version V1.0

  */

  public class Apple implements Fruit {

  @Override

  public void name() {

  System.out.println("apple");

  }

  }

  package com.pattern.build.facotry.simple;

  /**

  * 橘子

  * @author chuer

  * @date 2014-7-24 下午6:16:19

  * @version V1.0

  */

  public class Orange implements Fruit {

  @Override

  public void name() {

  System.out.println("orange");

  }

  }

  package com.pattern.build.facotry.simple;

  public class FruitFactory {//这个工厂是一个单例模式(针对普通工厂方法)

  private FruitFactory(){}

  private static FruitFactory factory = new FruitFactory();

  public static FruitFactory getInstance(){

  return factory;

  }

  //普通工厂方法模式:

  /**

  * 根据水果名称 实例化一个水果对象

  * @param name

  * @return

  */

  public Fruit createFruit(String name){

  Fruit fruit = null;

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

  fruit = new Apple();

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

  fruit = new Orange();

  }

  return fruit;

  }

  /**

  * 创建苹果

  * @return

  */

  public Fruit createApple(){

  return new Apple();

  }

  /**

  * 创建橘子

  * @return

  */

  public Fruit createOrange(){

  return new Orange();

  }

  //----------------------------分割线-----------------------------------

  //静态工厂方法模式

  public static Fruit create_fruit(String name){

  Fruit fruit = null;

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

  fruit = new Apple();

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

  fruit = new Orange();

  }

  return fruit;

  }

  /**

  * 创建苹果

  * @return

  */

  public static Fruit create_apple(){

  return new Apple();

  }

  /**

  * 创建橘子

  * @return

  */

  public static Fruit create_orange(){

  return new Orange();

  }

  }

  package com.pattern.build.facotry.simple;

  public class Client {

  public static void main(String[] args) {

  Fruit fruit = FruitFactory.getInstance().createFruit("apple");

  fruit.name();

  fruit = FruitFactory.getInstance().createFruit("orange");

  fruit.name();

  }

  }

  通过代码我们可以看出每种工厂方法模式都有两种写法,其中一种需要我们传递一个标识来确定要创建那种产品,而另一种不需要。

  也就是一种是单方法一种是多方法。

  优点就是简单易用。但是同样优点也是它的缺点 :当我们要新加一种叫做香蕉的水果时,我们必须修改工厂类。对我们后期维护增加

  了一点负担。

  抽象工厂模式可以拟补这一缺点。

  package com.pattern.build.facotry.abs;

  import com.pattern.build.facotry.simple.Fruit;

  public interface AbstractFactory {

  public Fruit crearFruit();

  }

  package com.pattern.build.facotry.abs;

  import com.pattern.build.facotry.simple.Apple;

  import com.pattern.build.facotry.simple.Fruit;

  public class AppleFactory implements AbstractFactory {

  @Override

  public Fruit crearFruit() {

  return new Apple();

  }

  }

  package com.pattern.build.facotry.abs;

  import com.pattern.build.facotry.simple.Fruit;

  import com.pattern.build.facotry.simple.Orange;

  public class OrangeFactory implements AbstractFactory {

  @Override

  public Fruit crearFruit() {

  return new Orange();

  }

  }

  看到抽象工厂模式的代码,我们看到确实如果要增加一种水果的话,不用修改原来以后的工厂类,而是重新建立一个类。但是如果存在很多的

  水果那么就会出现很多的工厂类。

  总之,工厂方法模式和抽象工厂模式各有优势。可以根据自己的真实情况,选择使用。