简单工厂模式定义为:简单工厂模式又称为静态工厂方法模型,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式结构图:
简单工厂模式包含如下角色:
1.Factory(工厂角色)
工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
2.Product(抽象产品角色)
抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
3.ConcreteProduct(具体产品类)
具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。
下面通过一个简单的例子实现简单工厂模式。
题目:使用简单工厂模式模拟宝马工厂(BMWFactory)造车(BMWCar),如果传入参数bmw320,则返回一个BMW320对象,如果传入参数bmwX5,则返回一个BMWX5对象,请实现该场景。
Factory类
package com.anchor.common.design.factory.simplefactory;
/**
* @PackgeName: com.anchor.common.design.factory.simplefactory
* @ClassName: BMWFactory
* @Author: Administrator
* Date: 2022/5/11 9:52
* project name: DesignModelTestWork
* @Version:
* @Description:
*/
public class BMWFactory {
public static BMWCar getCar(String car) throws Exception
{
if (car.equalsIgnoreCase("BMW320")){
return new BMW320();
}
else if (car.equalsIgnoreCase("BMWX5")){
return new BMWX5() {
};
}else
{
throw new Exception("对不起,暂时无法创造该车型。");
}
}
}
BMWCar接口
package com.anchor.common.design.factory.simplefactory;
/**
* @PackgeName: com.anchor.common.design.factory.simplefactory
* @ClassName: BMWCar
* @Author: Administrator
* Date: 2022/5/11 9:52
* project name: DesignModelTestWork
* @Version:
* @Description:
*/
public interface BMWCar {
public void create();
}
BMW320
package com.anchor.common.design.factory.simplefactory;
/**
* @PackgeName: com.anchor.common.design.factory.simplefactory
* @ClassName: BMW320
* @Author: Administrator
* Date: 2022/5/11 9:55
* project name: DesignModelTestWork
* @Version:
* @Description:
*/
public class BMW320 implements BMWCar{
@Override
public void create() {
System.out.println("成功创建了一台宝马320...");
}
}
BMWX5
package com.anchor.common.design.factory.simplefactory;
/**
* @PackgeName: com.anchor.common.design.factory.simplefactory
* @ClassName: BMWX5
* @Author: Administrator
* Date: 2022/5/11 9:56
* project name: DesignModelTestWork
* @Version:
* @Description:
*/
public class BMWX5 implements BMWCar{
@Override
public void create() {
System.out.println("成功创建了一台宝马X5......");
}
}
简单工厂模式优缺点
优点:
构造容易,逻辑简单。通过使用工厂类,外界不再需要关心如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有功能(方法)。
缺点:
1.简单工厂模式中的if else判断非常多,完全是Hard Code,如果有一个新产品要加进来,就要同时添加一个新产品类,并且必须修改工厂类,再加入一个 else if 分支才可以, 这样就违背了 “开放-关闭原则”中的对修改关闭的准则了。当系统中的具体产品类不断增多时候,就要不断的修改工厂类,对系统的维护和扩展不利。
2.一个工厂类中集合了所有的类的实例创建逻辑,违反了高内聚的责任分配原则,将全部的创建逻辑都集中到了一个工厂类当中,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。因此一般只在很简单的情况下应用,比如当工厂类负责创建的对象比较少时。
3.简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
适用环境:
工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。