通常,我们实例化一个类的方法就是去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语句来添加新产品。
原文:http://www.cnblogs.com/sxltj/p/5053355.html