转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/78426332
本文出自:猴菇先生的博客
1.定义:
定义一个用于创建对象的接口,让子类决定实例化哪个类。
2.使用场景:
在任何需要生成复杂对象的地方,都可以用工厂方法模式,用new就可以完成创建的对象无需使用。
3.说明:
需要产品抽象类定义产品的功能,具体产品类实现具体逻辑,工厂抽象类定义工厂的功能,
具体工厂类实现生产产品的逻辑,需要哪个产品就生成哪个产品的实例,有时候也可以利用
反射的方式更简洁的生产具体对象。
4.例子:
/**
* 产品抽象类,定义产品功能
*/
public abstract class Computer{
public abstract void open();
}
/**
* 具体的产品类,可以有多个,重写抽象方法,定义业务逻辑
*/
public class LenovoComputer extends Computer{
@Override
public void open(){
System.out.println("打开联想电脑");
}
}
public class AlienComputer extends Computer{
@Override
public void open(){
System.out.println("打开外星人电脑");
}
}
public class MacComputer extends Computer{
@Override
public void open(){
System.out.println("打开苹果电脑");
}
}
public abstract class Factory{
/**
* 某电脑类型的工厂方法
*
* @param clz 电脑的类型
*
* @return 具体型号的电脑对象
*/
public abstract <T extends Computer> T createComputer(Class<T> clz);
}
/**
* 工厂的具体实现类,负责创建并返回具体产品对象
*/
public class ComputerFactory extends Factory{
@SuppressWarnings("unchecked")
@Override
public <T extends Computer> T createComputer(Class<T> clz){
Computer computer = null;
try{
computer = (Computer)Class.forName(clz.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return (T)computer;
}
}
public class Test{
public static void main(String[] args){
Factory factory = new ComputerFactory();
LenovoComputer lenovo = factory.createComputer(LenovoComputer.class);
lenovo.open();
AlienComputer alien = factory.createComputer(AlienComputer.class);
alien.open();
MacComputer mac = factory.createComputer(MacComputer.class);
mac.open();
}
}
4.总结:
优点:降低了对象之间的耦合度,而且依赖于抽象的架构,其将实例化的任务交由子类去完成,有很好的拓展性。
缺点:每次添加新产品时就要编写新的产品类,同时还要引入抽象层,导致类结构的复杂化。