简单工厂模式概述
简单工厂模式并不属于23个经典设计模式之一,但是通常将简单工厂模式作为学习其他工厂模式的基础。
应用场景
当需要大量创建同属于一类的不同对象时,我们可以应用简单工厂模式。
概念
工厂类:根据不同的参数用于创建具体产品对象的类。
具体产品类:实际的产品类。
抽象产品类:产品类进行抽象和提取后,将大量相同的操作或者变量封装到抽象类中。
具体操作
简单工厂模式:定义一个工厂类,可以根据参数的不同返回不同类的实例(一般具有共同的父类)。
具体例子
假设我们需要一些图形,这些图形有圆形、三角形……;
当我们没有学设计模式的时候,我们会用最蠢笨的方式:每一个圆形类、三角形类,都创建没有关联的类,这样我们耦合度极高。
而我们这时候可以利用简单工厂模式来解耦。
参考如下:
- Factory:工厂类,用于通过不同参数来确定创建的对象。
- Chart:抽象产品类,是圆形类、三角形类的共同属性或者方法抽象出来的抽象类。
- Circular、Triangle:具体产品类。
//Factory类
public class Factory {
public static Chart getProduct(String args){
Chart chart=null;
if(args=="Triangle"){
chart=new Triangle();
}else if(args=="Circular"){
chart=new Circular();
}
return chart;
}
}
//Chart类
public abstract class Chart {
public abstract void logChart();
}
public class Circular extends Chart{
@Override
public void logChart() {
System.out.println("我是圆形");
}
}
public class Triangle extends Chart{
@Override
public void logChart() {
System.out.println("我是三角形");
}
}
测试类:
//测试类
public class Test {
public static void main(String[] args) {
Chart chart=Factory.getProduct("Triangle");
chart.logChart();
chart=Factory.getProduct("Circular");
chart.logChart();
}
}
运行结果:
总结
简单工厂模式的简化
为了简化结构,我们可以把抽象产品类和工厂类合并,将静态工厂方法移动到抽象产品类中。
优点
- 实现了对象创建和使用的分离
- 可以一定程度上减少使用者记忆量
- 引入配置文件,可以不修改客户端代码下更换和增加新的具体产品类。
缺点
- 工厂类职责过重,若工厂类无法正常工作,整个系统会受到影响。
- 会增加类的个数
- 系统扩展困难,如果扩展那么必定修改工厂类逻辑。
- 简单工厂模式由于使用了静态工厂模式,造成工厂角色无法形成基于继承的等级结构。
适用场景
- 工厂类负责创建的对象比较少,这样工厂方法中业务逻辑不会太重,不会有太多if。
- 客户端只需要知道传入工厂类的参数,不关心如何创建对象。