我的第一篇博文——设计模式---工厂模式

一、简单工厂模式浅述

通常,我们实例化一个类的方法就是去new相应的对象出来,如:

  Example e = new Example();
  e.setXXX(……);
  ………………

在代码少的情况下,这是最直观的解决方式。但是,在需要多个Example实例创建的地方,这样未免显得:

1.代码重复,多个Example的创建会有重复代码。

2.可修改性差,要修改所有Example setXXX方法的参数,就要把所有Example对象的setXXX方法都修改一遍,很浪费时间。

这时候,工厂模式就起作用了。工厂模式可以将类创建的过程搬到工厂方法里,客户端只需要关心调用工厂方法就行了。实现图如下(PS:博主用平板写博文,没有UML绘图工具,只能手绘,请见谅):

工厂模式示意图 首先来实现我们的产品接口,也就是IProduct:ICoffee

  package factory;

  public interface ICoffee{
    // 咖啡的信息
    public void printInfo();
  }

然后分别创建具体的咖啡类Coffee,实现ICoffee接口

  package factory;

  public class Coffee implements ICoffee
  {
    // 咖啡的价格
    public float price;
    // 咖啡的容积
    public float size;
    // 咖啡的种类
    public String type;
	
	@Override
	public void printInfo(){
	  // TODO: Implement this method
	  System.out.println("———————————————————————");
	  System.out.println("咖啡的价格为:"+price+"元");
      System.out.println("咖啡共"+size+"毫升");
      System.out.println("咖啡种类为:"+type);
	}
  }

然后具体实现工厂类:生产咖啡的工厂,含有静态工厂方法newCoffee(),相当于把new Coffee的创建过程搬到了CoffeeFactory里面,客户端多次调用就会省很多代码,并且可修改性良好,只需要修改工厂方法就行了。

  package factory;

  // 咖啡工厂的实现类
  public class CoffeeFactory
  {
    // 工厂方法:生产咖啡
    @Override
    public static Coffee newCoffee(String type){
      // TODO: Implement this method
      Coffee coffee = new Coffee();
      if(type == null){
        throw new NullPointerException();
      }
      switch(type){
        // 原味咖啡才是王道
        case "Normal":
          coffee.price = 5f;
          coffee.size = 300f;
          coffee.type = "原味咖啡";
          break;
        // 加牛奶咖啡
        case "Milk":
          coffee.price = 7f;
          coffee.size = 300f;
          coffee.type = "牛奶咖啡";
          break;
        // 加糖咖啡
        case "Sugar":
          coffee.price = 5.5f;
          coffee.size = 300f;
          coffee.type = "加糖咖啡";
          break;
        // 双份大杯咖啡
        case "Double":
          coffee.price = 10f;
          coffee.size = 600f;
          coffee.type = "大杯咖啡";
          break;
        default:
          throw new IllegalArgumentException("你要的咖啡本店没有");
      }
      return coffee;
  }
}

万事具备,只欠东风,我们的客户端只需调用就行啦:

  import factory.*;

  public class Main
  {
    public static void main(String[] args)
    {
      Coffee coffee = CoffeeFactory.newCoffee("Milk");
      coffee.printInfo();
      Coffee coffee2 = CoffeeFactory.newCoffee("Sugar");
      coffee2.printInfo();
      Coffee coffee3 = CoffeeFactory.newCoffee("Normal");
      coffee3.printInfo();
      Coffee coffee4 = CoffeeFactory.newCoffee("Double");
      coffee4.printInfo();
    }
  }
  ProgramOutput:
  ————————————————————————
  咖啡的价格为:7.0元
  咖啡共300.0毫升
  咖啡种类为:牛奶咖啡
  ————————————————————————
  咖啡的价格为:5.5元
  咖啡共300.0毫升
  咖啡种类为:加糖咖啡
  ————————————————————————
  咖啡的价格为:5.0元
  咖啡共300.0毫升
  咖啡种类为:原味咖啡
  ————————————————————————
  咖啡的价格为:10.0元
  咖啡共600.0毫升
  咖啡种类为:大杯咖啡

是不是非常简单呢?

二、简单工厂模式总结
工厂模式的优点:

1.在需要大量创建一个类的时候,工厂模式可以省不少代码。

2.可修改性强,所有的调用都指向工厂方法,只需要修改工厂方法即可。

3.符合单一职责原则,客户端只关心调用,工厂类只关心生产。

工厂模式缺点:

1.在只需要一个或两三个类实例创建的时候,工厂模式是较麻烦和复杂的。

2.违背了开闭原则,当新产品出现的时候,必须修改工厂方法的if语句或switch语句来添加新产品。

转载于:https://www.cnblogs.com/sxltj/p/5053355.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值