简单工厂模式的定义
简单工厂模式又叫静态工厂模式,在简单工厂模式中,可以根据不同的参数返回不同的实例,被创建的实例通常都有共同的接口。
UML图
IProduct:接口。简单工厂模式所创建的所有对象的接口,它负责描述所有实例要实现的公共接口。
Prouduct:具体子类,是简单工厂模式的创建目标,可以有多种。
Factory:工厂类,简单工厂模式的核心,它负责根据逻辑需求,创建所有实例。createProduct方法可以被外界直接调用,创建所需的实例。
示例:
- 有一个工厂,生产产品Product。
- 最近推出了3个产品ProductA/B/C,使用简单工厂模式实现3款产品的生产。
产品接口
interface Product{
void Show();
}
3款产品
//具体产品类A
class ProductA implements Product{
@Override
public void Show() {
System.out.println("生产出了产品A");
}
}
//具体产品类B
class ProductB implements Product{
@Override
public void Show() {
System.out.println("生产出了产品C");
}
}
//具体产品类C
class ProductC implements Product{
@Override
public void Show() {
System.out.println("生产出了产品C");
}
}
简单工厂类:
class Factory {
public static Product Manufacture(String ProductName){
//工厂类里用switch语句控制生产哪种商品;
//使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
switch (ProductName){
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
return null;
}
}
}
//工厂产品生产流程
public class SimpleFactoryPattern {
public static void main(String[] args){
Factory mFactory = new Factory();
//客户要产品A
try {
//调用工厂类的静态方法 & 传入不同参数从而创建产品实例
mFactory.Manufacture("A").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品B
try {
mFactory.Manufacture("B").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品C
try {
mFactory.Manufacture("C").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
//客户要产品D
try {
mFactory.Manufacture("D").Show();
}catch (NullPointerException e){
System.out.println("没有这一类产品");
}
}
}
输出结果
生产出了产品A
生产出了产品C
生产出了产品C
没有这一类产品
优缺点
优点
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
缺点
- 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
- 违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。