设计模式之工厂方法模式

时间:2022-10-02 17:07:51

工厂方法模式使用的频率非常高,在我们的日常开发中总能见到,也许你一直在使用但是却不知道其实他的名字叫工厂方法模式。


工厂方法模式的定义如下:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。


工厂方法的通用类图如下:


设计模式之工厂方法模式

 

工厂方法模式的通用代码如下:


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("具体业务逻辑");
}

}

看完通用类图和通用代码之后,不知道大家会不会想起自己的代码是否有用过的此模式的地方


工厂模式的优点:

  1. 良好的封装性
  2. 灵活的扩展性
  3. 屏蔽产品类(产品类的实现如何变化,调用者都不需要关心,它只关心产品的接口,只要接口不变,系统中的高层模块就不需要改变)  


具体应用之汽车生产


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

}