定义一个用于创建对象的接口, 我们需要一个对象实例的时候就可以通过调用接口的方法来获取我们想要的对象实例。
首先, 最简单的:
/** * 简单工厂接口, 可以返回实例 */ public interface SimpleFactory { Money getMoney(); }
/** * 工厂实现类, 返回Money实例 */ public class MoneyFactoryImpl implements SimpleFactory { public Money getMoney() { return new Money(); } }
public class Money { private String country; private String value; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "币种:" + this.country + "\n面值:" + this.value; } }
//测试类 public class Test { public static void main(String[] args) { SimpleFactory<Money> factory = new MoneyFactoryImpl(); Money money = factory.getMoney(); } }
上面这个是最简单的工厂, 看都能看出来虽然很简单, 但是缺点很多, 所以一般开发似乎都不怎么用。
我觉得最简单, 最好用的就是下面这种, 他可以临时指定要实例化的类, 有点像去工厂, 就说钱, 它就给你钱, 如果你说人, 它就给你造人(不要乱想)。
首先当然还要定义一个接口, 要面向接口编程才可以扩展, 复用嘛。
public interface Factory<T> { public T getInstance(Class clazz); }
//工厂实现类 public class FactoryImpl<T> implements Factory<T> { public T getInstance(Class clazz) { try { return (T) Class.forName(clazz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return null; } } //Money类 public class Money { private String country; private String value; public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "币种:" + this.country + "\n面值:" + this.value; } } //Person类 public class Person{ private int ID; private String name; private int age; //省略getter、setter } //测试类 public class Test{ public static void main(Sring[] args){ Factory<Money> fa = new FactoryImpl<Money>(); Money money = fa.getInstance(Money.class); Person person = fa.getInstance(Person.class); } }
上面这个工厂就比较灵活, 只要指定类型它就可以返回一个对象, 也可以通过解析String字符串来指定要创建的类型。用泛型来解决返回的类型问题。
工厂有很多实现, 只不过是一种想法而已, 这样更容易集中管理, 比如说你的项目当中突然要创建Money实例的时候要默认把country设置成中国, 那你需要做的就只是在工厂类里给他设置下就可以了, 而不用整个项目去搜索创建Money类的代码, 然后在每行代码下给country设置成中国。 集中生产也容易集中管理。对于我们开发者来说非常省事。工厂模式也只是一个思想, 如果要用到自己的程序上可以因情况不同,
而设计其他工厂类, 比如抽象工厂也不错。Spring使用IOC, 更智能, 就比如你想要钱, 这时候看手上就是钱, 你想要斧子, 手里突然有了一把斧子,你不需要的时候也不用担心, 自己就没了。