假设要创建一个图表库来生成各种图表视图。看下最简单的写法
//一个类封装了多个产品,过于臃肿,不利于维护,违背开闭原则
public class Chart {
private String type;
public Chart(String type){
this.type = type;
if("histogram".equals(type)){
//初始化柱状图
}else if("pie".equals(type)){
//初始化饼状图
}else if("line".equals(type)){
//初始化折线图
}
}
public void display(){
if(this.type.equals("histogram")){
//显示柱状图
}else if("pie".equals(type)){
//显示饼状图
}else if("line".equals(type)){
//显示饼状图
}
}
}
以上写法过于臃肿,违背开闭原则,不利于维护,下面使用简单工厂方法来实现
1.声明一个抽象的图标接口,用于各种图表的继承
public interface Chart {
void display();
}
2.实现各个图表类
public class HistogramChart implements Chart{
public HistogramChart(){
System.out.println("创建柱状图");
}
@Override
public void display() {
System.out.println("显示柱状图");
}
}
public class LineChart implements Chart{
public LineChart(){
System.out.println("创建饼状图");
}
@Override
public void display() {
}
}
public class PieChart implements Chart{
public PieChart(){
System.out.println("创建饼状图");
}
@Override
public void display() {
System.out.println("显示饼状图");
}
}
3.实现工厂类,提供静态工厂方法用于生成各种图表
public class ChartFactory {
public static Chart getChart(String type){
Chart chart = null;
if("histogram".equals(type)){
chart = new HistogramChart();
System.out.println("初始化柱状图");
}else if("pie".equals(type)){
chart = new PieChart();
System.out.println("初始化饼状图");
}else if("line".equals(type)){
chart = new LineChart();
System.out.println("初始化折线图");
}
return chart;
}
}
4.实现客户端测试工厂方法
public class Client {
public static void main(String[] args) {
Chart chart;
chart = ChartFactory.getChart("pie");
chart.display();
}
}
5.UML类图的实现(缺少画图软件,后期补上)
总结:简单工厂方法就是抽象一个产品接口,使各个产品实现这个接口进而将产品的实现解耦到具体的实现类中。通过加工厂类的静态工厂方法实现产品的创建,客户端调用工厂类来获得具体的产品。形象点就是,你需要一把车,找专业的造车产给你造车,造好后负责使用就行,无需管车是怎么造出来的,各司其职。这也是面向对象的思想和单一职责的体现。以上就是简单工厂方法的实现。