`

设计模式之工厂方法模式

 
阅读更多

        最近一直在看设计模式相关的书籍,决定正确每天将自己学到的设计模式以及自己的理解写成博客,供大家参考和点评,主要目的还是对自己的学习做一下总结。

         最近看到一本设计模式的书籍《设计模式之禅》已经通读一遍,现在是第二遍阅读,感觉作者对设计模式的讲解很通俗易懂,通过对这本书的学习也加深自己对java框架方面的理解,java框架上又很多设计模式,以前上学的时候也学过设计模式,但是当时的理解只是停留在记忆上,并没有真正的用到实践中,通过读这本书之后回看自己开发过的项目,感觉有的地方如果使用一些设计模式的话那么代码的可扩展性会更加灵活。

       好了就说道这里,本人也不是什么码字高手,只能将自己的理解记录一下吧,今天写工厂方法模式,

其实做项目开发中,工厂方法模式我们一直都在使用,像java中的JDBC连接数据库,其实使用的就是工厂方法模式,当我们将mysql数据换到oracle数据库时,我们只需要换一下驱动就可以,这就是工厂方法模式的灵活性。

 

工厂方法模式类图(以汽车生产为例)



 

具体代码如下

 

public abstract class AbstractCarFactory {

    // 生产汽车
    protected abstract <T extends AbstractCar> T createCar(Class<T> c);
}

 

下面是汽车工厂的具体实现类

 

public class CarFactory extends AbstractCarFactory {

    /**
     * 生产汽车
     * 
     * @param c
     * @return
     */
    @Override
    protected <T extends AbstractCar> T createCar(Class<T> c) {

        AbstractCar car = null;

        try {
            car = (T) Class.forName(c.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("生产汽车时发生异常:" + e.getMessage());
        }

        return (T) car;
    }

}

 

目前我们的开发中用的最多的可能也是Spring这个框架,其实Spring中也有用过工厂,当我们需要使用一个对象是Spring会根据我们在配置文件中的配置为我们生产一个对象

 

下面是汽车的抽象类:

 

public abstract class AbstractCar {

    // 每个汽车都能跑
    protected abstract void run();
}

 

汽车工厂与汽车之间的关系停留在抽象层间的依赖,这样做可以减少实现类之间的耦合,提高的代码的扩展性。

 

public class BenzCar extends AbstractCar {


    /**
     * 
     * @see com.huashao.chapter.chapter08.AbstractCar#run()
     */
    @Override
    protected void run() {

        System.out.println("奔驰生产成功");
    }

}

 

测试:

 

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //初始化工厂,如果工长初始化时间很长,可以在项目启动创建
        AbstractCarFactory factory=new CarFactory();
        //生产奔驰汽车
        AbstractCar car=factory.createCar(BenzCar.class);
        //测试
        car.run();
    }

}

 

所谓工厂方法的灵活性就在于如果我想生存宝马汽车,我只需要修改

AbstractCar car=factory.createCar(BMWCar.class);

即可

  • 大小: 36.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics