专栏首页java闲聊设计模式之简单工厂

设计模式之简单工厂

  • 模拟场景 客户提出要购买100t苹果,
package com.tanoak.create.factory.simple.demo;

/**
 * @author tanoak@qq.com
 * @date 2018/8/1 22:31
 * @Desc
 */
public class Apple {
  private String name ;

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public Apple(String name) {
      this.name = name;
  }

  @Override
  public String toString() {
      return "Apple{" +
              "name='" + name + '\'' +
              '}';
  }

  public static void main(String[] args) {
      Apple a = new Apple("红色的苹果") ;
      System.out.println(a.toString());
  }
}

  • 然后农场主跑去收购100t苹果给客户
package com.tanoak.create.factory.simple.demo;

/**
 * @author tanoak@qq.com
 * @Desc
 */
public class Banana  {
  private String name ;

  public String getName() {
      return name;
  }

  public void setName(String name) {
      this.name = name;
  }

  public Banana(String name) {
      this.name = name;
  }

  @Override
  public String toString() {
      return "Banana{" +
              "name='" + name + '\'' +
              '}';
  }
  public static void main(String[] args) {
      Apple a = new Apple("红色的苹果") ;
      Banana b = new Banana("香蕉") ;
      System.out.println(a.toString());
  }

}
  • 这样会带来的问题很明显,main方法变得很臃肿,来看下简单工厂是如何解决这个问题的
    1. 创建水果接口
 package com.tanoak.create.factory.simple;

/** 
 * @author tanoak@qq.com 
 * @Desc
 */ 
public interface IFruit {

  void name();
}
  1. 创建工厂类并实现水果接口
package com.tanoak.create.factory.simple;

/**
 * @author tanoak@qq.com
 * @Desc
 */
public class FruitFactory {

   private FruitFactory(){}

   public static IFruit createProduct(String name){//生产水果
       String apple = "apple" ;
       String banana = "banana" ;
       if (name == null) {
           return null;
       }
       if (name.equals(banana)) {
           return new Banana();
       }else if (name.equals(apple)) {
           return new Apple();
       }else {
           return null;
       }
   }
}

作者:tanoak
链接:https://www.jianshu.com/p/9c21f9b9789f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
  1. 苹果与香蕉类实现水果接口

package com.tanoak.create.factory.simple;

/** 
 * @author tanoak@qq.com
 * @date 2018/7/19 16:43
 * @Desc
 */ 
public class Apple implements IFruit{
    private String name ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Apple(String name) {
        this.name = name;
    }

    public Apple() {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public void name() {
        this.setName(name);
        System.out.println("The is Apple");
    }
}
//

package com.tanoak.create.factory.simple;

/** 
 * @author tanoak@qq.com
 * @date 2018/7/19 16:43
 * @Desc
 */ public class Banana implements IFruit{

    private String name ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Banana(String name) {
        this.name = name;
    }
    public Banana() {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Banana{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public void name() {
        this.setName(name);
        System.out.println("This is Banana");
    }
}

作者:tanoak
链接:https://www.jianshu.com/p/9c21f9b9789f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
 

编写好之后,来看Main方法,当需要苹果时只需要修改一个参数就行了,并不需要在main方法中new,有小伙伴可能要问了,这代码没变少反而多了,关于这个问题请看设计模式序言

package com.tanoak.create.factory.simple;
/**
 * @author tanoak@qq.com
 * @Desc  简单工厂模式
 */
public class Main {

    public static void main(String[] args) {
        IFruit apple = FruitFactory.createProduct("apple");//banana
        apple.name();
    }
}

作者:tanoak
链接:https://www.jianshu.com/p/9c21f9b9789f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

如理解有误,请指正,谢谢

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • POI之easypoi操作(二)

    tanoak
  • 观察者模式

    tanoak
  • 设计模式之抽象工厂模式

    tanoak
  • java8 Lambda尝尝鲜

    转载:猿天地 链接:http://cxytiandi.com/blog/detail/2196 java8都已经发布这么久了,一直没来得及使用,线上环境基本...

    猿天地
  • 深度解析反射机制

    之前的文章,有小伙伴留言说希望出一篇反射的教程,那今天我们就来说一说反射。对,就是这么好,所有小伙伴在留言,私信中提的问题,我都会逐一解答,提的一些要求,我也会...

    南风
  • fastjson:获取类(Class)的所有可序列化字段(field)

    用fastjson对一个类进行序列化时,在没有类的实例只有类的Class的情况下,如果想知道这个Class有所有可以被序列化的字段名,可以用com.alibab...

    用户1148648
  • Struts Action 控制器

    可以看到,定义了几个常量一个接口,其中默认执行execute方法,其中几个常量为执行结果的常量

    mySoul
  • Java泛型学习

    1、泛型的概念     泛型即“参数化类型”,就比如我们定义方法的时候,定义一个变量,称为形参,变量值根据传进去的实参的值不同而改变。而泛型的出现,就是为了解决...

    JMCui
  • Java基础巩固——反射

    什么是反射 ----    反射机制就是指程序运行时能够获取自身的信息。在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 -...

    Janti
  • 设计模式之原型模式

    我们在创建对象时,通常是通过new关键字来创建的。但是,思考一下,如果当前类的构造函数很复杂,每次new对象时都会消耗非常多的资源,这样肯定是不行的,耗时又费力...

    烟雨星空

扫码关注云+社区

领取腾讯云代金券