一、简单工厂模式浅述
通常,我们实例化一个类的方法就是去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语句来添加新产品。