设计模式之工厂方法模式
工厂是一个生产产品的地方,它本身不会平白无故地就开始生产一些产品,而是当有需求的时候,才生产出被需要的产品,工厂本身与需要产品这件事本身没有太多关联。工厂方法模式也正是如此。
工厂方法模式一般由如下四个部分组成:
1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
我找了一个工厂方法模式的UML图,毕竟自己画起来很鸡儿麻烦,这个图上对每一个部分都有文字解释,还是很不错的,那么然后,我们来写一个工厂方法模式吧,当一把厂长
先来一个抽象产品吧,假设我们来生产球,球都会滚动
public interface IBall{ public void roll(); }
然后具体的球呢,比如说我们来个篮球,足球,棒球
class Basketball implements IBall{ @Override public void roll() { System.out.println("Basketball rolls"); } } class Football implements IBall{ @Override public void roll() { System.out.println("Football rolls"); } } class Baseball implements IBall{ @Override public void roll() { System.out.println("Baseball rolls"); } }
下面就是我们的重头戏来了,工厂要开张了,先来个抽象工厂角色
abstract class abstractFactory{ public abstract <T extends IBall> T createBall(Class<T> c); }
有了这个抽象工厂角色,再来个具体工厂的实现:
public class Factory extends abstractFactory{ @SuppressWarnings("unchecked") @Override public <T extends IBall> T createBall(Class<T> c) { IBall ball = null; try { ball = (T)Class.forName(c.getName()).newInstance(); }catch(Exception e){ } return (T)ball; } }
这样,一个简单的工厂方法模式就完成了!让我们来测试一下:
public static void main(String[] args) { abstractFactory factory = new Factory(); Basketball basketball = factory.createBall(Basketball.class); basketball.roll(); Football football = factory.createBall(Football.class); football.roll(); Baseball baseball = factory.createBall(Baseball.class); baseball.roll(); }
测试结果就不贴了,这样就是工厂方法模式。工厂方法模式具有良好的封装性,代码结构清晰,而且代码扩展性好,模块间耦合度低。工厂方法模式符合单一职责原则,符合迪米特原则,也符合依赖倒置原则和里氏原则,在很多源码中闪烁着耀眼的光华,当然它也不是完美的,比如以上代码,生产的东西简单的时候,这个抽象工厂类几乎没有什么作用。于是我们可以把它去掉,只用一个具体工厂类来体现,这样就是简单工厂模式,可以说是工厂方法模式的一个特例。工厂方法模式还有诸多扩展,比如多工厂,比如延迟加载等,就不一一细说了。