版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaorongke/article/details/82994484
1.定义
简单工厂模式又叫做静态方法模式,通过定义工厂类来生产其他类的实例。
2.作用
使用者可以直接调用工厂类的接口获取产品对象,不需要知道生产产品对象的具体细节,将创建对象和使用对象分离开来,实现代码解耦。
3.模式角色
- 工厂:对外提供接口,根据传入参数的不同创建不同的产品实例;
- 抽象产品:描述产品特性的公共接口;
- 具体产品:描述具体的产品,工厂类生产的目标。
4.实现方法
a. 创建抽象产品类,里面定义具体产品的公共接口。
/**
* 简单工厂模式(静态方法模式) - 抽象产品类
*
* @author rkyao
* @date 2018/9/11
*/
public abstract class AbstractProduct {
/**
* 具体产品的公共接口
*/
public abstract void show();
}
b. 创建具体产品类,定义产品的具体产品。
/**
* 简单工厂模式(静态方法模式) - 具体产品类A, 定义生产的具体产品A
*
* @author rkyao
* @date 2018/9/11
*/
public class ConcreteProductA extends AbstractProduct {
@Override
public void show() {
System.out.println("具体产品类A, 生成产品A.");
}
}
/**
* 简单工厂模式(静态方法模式) - 具体产品类B, 定义生产的具体产品B
*
* @author rkyao
* @date 2018/9/11
*/
public class ConcreteProductB extends AbstractProduct {
@Override
public void show() {
System.out.println("具体产品类B, 生成产品B.");
}
}
c. 创建工厂类,根据传入参数的不同创建不同的产品实例。
/**
* 简单工厂模式(静态方法模式) - 工厂类
*
* @author rkyao
* @date 2018/9/11
*/
public class Factory {
/**
* 方式一:使用逻辑判断的方式实现
* 通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
*
* @param productName
* @return
*/
public static AbstractProduct manufacture1(String productName) {
switch (productName) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
return null;
}
}
/**
* 方式二:使用反射方式实现,更好
*
* @param clazz
* @return
*/
public static AbstractProduct manufacture2(Class clazz) {
AbstractProduct product = null;
try {
product = (AbstractProduct) Class.forName(clazz.getName()).newInstance();
} catch (InstantiationException e) {
System.out.println("不支持抽象类或接口");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("没有足够权限, 即不能访问私有对象");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("类不存在");
e.printStackTrace();
}
return product;
}
}
简单工厂模式通过上面a、b、c三步已实现完成,下面演示一下如何使用:
/**
* 简单工厂模式(静态方法模式) - 测试类
*
* @author rkyao
* @date 2018/9/11
*/
public class FactoryTest {
public static void main(String[] args) {
// 客户要产品A,方式一获取
try {
// 调用工厂类的静态方法 & 传入不同参数从而创建产品实例
Factory.manufacture1("A").show();
} catch (NullPointerException e) {
e.printStackTrace();
System.out.println("没有该类产品");
}
// 客户要产品B,方式二获取
try {
Factory.manufacture2(ConcreteProductB.class).show();
} catch (NullPointerException e) {
e.printStackTrace();
System.out.println("没有该类产品");
}
}
}
简单工厂模式的缺陷:所有产品的创建逻辑都在工厂类里,一旦工厂类异常,所有产品的创建都会受到影响;违背了 “开发-封闭”原则,一旦增加新的产品就要在工厂类里添加新的逻辑,会造成工厂类的逻辑过于臃肿。