设计模式之工厂方法模式
2015-05-29 10:49
447 查看
工厂方法模式使用的频率非常高,在我们的日常开发中总能见到,也许你一直在使用但是却不知道其实他的名字叫工厂方法模式。
工厂方法模式的定义如下:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法的通用类图如下:
![](http://img.blog.csdn.net/20150529110306843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdWh1YTAxMDQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
工厂方法模式的通用代码如下:
看完通用类图和通用代码之后,不知道大家会不会想起自己的代码是否有用过的此模式的地方
工厂模式的优点:
良好的封装性
灵活的扩展性
屏蔽产品类(产品类的实现如何变化,调用者都不需要关心,它只关心产品的接口,只要接口不变,系统中的高层模块就不需要改变)
具体应用之汽车生产
工厂方法模式的定义如下:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法的通用类图如下:
工厂方法模式的通用代码如下:
public abstract class Creator { public abstract <T extends Product> T factoryMethod(Class<T> c); }
public class ConcreteCreator extends Creator { /** * @param c * @return */ @Override public <T extends Product> T factoryMethod(Class<T> c) { Product product=null; try { product=(Product) Class.forName(c.getName()).newInstance(); } catch (Exception e) { // TODO Auto-generated catch blockd e.printStackTrace(); } return (T) product; } }
public abstract class Product { // 公共方法 public void sameMethod() { } public abstract void doSomething(); }
public class ConcreteProduct extends Product { /** * * @see com.huashao.chapter.chapter08.Product#doSomething() */ @Override public void doSomething() { System.out.println("具体业务逻辑"); } }
看完通用类图和通用代码之后,不知道大家会不会想起自己的代码是否有用过的此模式的地方
工厂模式的优点:
良好的封装性
灵活的扩展性
屏蔽产品类(产品类的实现如何变化,调用者都不需要关心,它只关心产品的接口,只要接口不变,系统中的高层模块就不需要改变)
具体应用之汽车生产
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 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; } }
相关文章推荐
- 第三章 42题
- Spring注解注入
- org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping clas
- [150529](必看)档案挂靠与打回生源地、暂缓的对比 (广州)
- MySQL order by性能优化方法实例
- Android NDK学习 <二> Android.mk的制作
- gcc降版本
- linux dmesg命令使用
- MVC框架
- Android Studio 1.3 到来了,马上来升级
- C#生成随机数
- mac上的应用提权
- android hander
- JAVA JSON格式转MAP
- Jdeveloper启动报错-jvm.dll
- 如何制定GRE作文提纲
- Block的基本用法
- 自定义类似优酷首页的BannerView幻灯片展示
- 简单的WebService实现- cxf
- P124.40