1.定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类,FactoryMethod使一个类的实例化延迟到其子类.
2.意识图
3.代码示例
联想工厂创建联想的电脑,戴尔创建戴尔的电脑
1)电脑接口
/**
* 电脑接口
* wuyanlin2016@163.com
* 2017年12月25日
*/
public interface Computer {
/**
* 描述-->一句话简介
* @param description 描述语
*/
public void describe(String description);
}
2).戴尔电脑
/**
* Dell电脑
* wuyanlin2016@163.com
* 2017年12月25日
*/
public class DellComputer implements Computer {
@Override
public void describe(String description) {
System.out.println(description);
}
}
3).联想电脑
/**
* Lenovo电脑
* wuyanlin2016@163.com
* 2017年12月25日
*/
public class LenovoComputer implements Computer {
@Override
public void describe(String description) {
System.out.println(description);
}
}
4).电脑工厂
/**
* 电脑工厂
* wuyanlin2016@163.com
* 2017年12月25日
*/
public class ComputerFactory {
public static Computer buildComputer(String pcName) {
if("dell".equalsIgnoreCase(pcName)) return new DellComputer();
if("lenovo".equalsIgnoreCase(pcName)) return new LenovoComputer();
return null;
}
}
5).电脑操作类
/**
* 电脑操作类,调用工厂创建电脑
* wuyanlin2016@163.com
* 2017年12月25日
*/
public class ComputerOperator {
/**
* 创建电脑
* @param pcName 电脑名字
* @param description 电脑描述
*/
public void createComputer(String pcName,String description) {
ComputerFactory.buildComputer(pcName).describe(description);
}
}
6).客户端类
/**
* 客户端
* wuyanlin2016@163.com
* 2017年12月25日
*/
public class Client {
public static void main(String[] args) {
ComputerOperator computerOperation = new ComputerOperator();
computerOperation.createComputer("lenovo", "我是联想");
computerOperation.createComputer("dell", "我是戴尔");
}
}
7).结果
我是联想
我是戴尔
4.总结
何时选用?
1).一个接口多个实现,但是又不知道具体用哪一个实现,由子类去指定
2).系统设计本身就由子类去指定实现类