设计模式之工厂方法模式

  工厂是一个生产产品的地方,它本身不会平白无故地就开始生产一些产品,而是当有需求的时候,才生产出被需要的产品,工厂本身与需要产品这件事本身没有太多关联。工厂方法模式也正是如此。

  工厂方法模式一般由如下四个部分组成:

  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();
    }

测试结果就不贴了,这样就是工厂方法模式。工厂方法模式具有良好的封装性,代码结构清晰,而且代码扩展性好,模块间耦合度低。工厂方法模式符合单一职责原则,符合迪米特原则,也符合依赖倒置原则和里氏原则,在很多源码中闪烁着耀眼的光华,当然它也不是完美的,比如以上代码,生产的东西简单的时候,这个抽象工厂类几乎没有什么作用。于是我们可以把它去掉,只用一个具体工厂类来体现,这样就是简单工厂模式,可以说是工厂方法模式的一个特例。工厂方法模式还有诸多扩展,比如多工厂,比如延迟加载等,就不一一细说了。

posted @ 2017-12-15 15:30  fengshenjingjun  阅读(190)  评论(0编辑  收藏  举报