工厂方法模式使用的频率非常高,在我们的日常开发中总能见到,也许你一直在使用但是却不知道其实他的名字叫工厂方法模式。
工厂方法模式的定义如下:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法的通用类图如下:
工厂方法模式的通用代码如下:
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;
}
}