尺有所短,寸有所长;不忘初心,方得始终。
简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于23种设计模式之一。
简单工厂模式又称为静态工厂模式,实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
一、简单工厂模式角色及其职责
-
工厂(Creator)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
-
抽象产品(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
-
具体产品(Concrete Product)角色
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
二、案例
以生产汽车为例,汽车有很多种,对于购买汽车的用户来说,不用管汽车有多少种类,只需要在厂家购买自己所要的汽车就可以,而不同的用户买的汽车不一样,所以对于厂家而言就需要对不同的客户生产不同的汽车。
以上案例的简单工厂UML类图:

三、简单工厂模式实现
-
定义一个接口或者抽象类,确定工厂行为
/**
* 抽象产品类代码
*/
public interface ICar {
void GetCar();
} -
定义具体的产品类 并且实现抽象类
/**
* 具体汽车 : 越野车
*/
public class JeepCar implements ICar {
@Override
public void GetCar() {
System.out.println("这是越野车");
}
}
/**
* 具体汽车 : 跑车
*/
public class SportCar implements ICar {
@Override
public void GetCar() {
System.out.println("这是跑车");
}
}
/**
* 具体汽车 : 两箱车
*/
public class HatchbackCar implements ICar {
@Override
public void GetCar() {
System.out.println("这是两箱车");
}
} -
简单工厂代码 Factory
/**
* 简单工厂核心代码
*
* 工厂类,具体实现
*/
public class Factory{
public ICar GetCar(String carType){
switch (carType){
case "跑车":
return new SportCar();
case "越野车":
return new JeepCar();
case "两箱车":
return new HatchbackCar();
default:
return null;
}
}
} -
客户端调用
public static void main(String[] args) {
ICar iCar = new Factory().GetCar("跑车");
if(null == iCar){
System.out.println("没有这个车型");
}
iCar.GetCar();
}
四、简单工厂的优点/缺点
-
优点
-
工厂类是处理必要的逻辑判断是简单工厂的核心。根据客户端的参数决定创建具体对象。
-
通过使用工厂类,客户端与产品类解耦。
-
缺点
-
由于工厂类集中了所有实例的创建逻辑,违反了开闭原则,将全部创建逻辑集中到了一个工厂类中。 -
新增产品类时需要修改工厂类,扩展性较差,不易维护。
五、简单工厂模式和策略模式区别
-
策略模式和简单工厂模式都是通过多态来实现不同子类的选取。 -
在简单工厂模式中实现了通过条件选取一个类去实例化对象,策略模式则将选取相应对象的工作交给模式的使用者,它本身不去做选取工作。 -
简单工厂模式中只需要传递相应的条件就能得到想要的一个对象,然后通过这个对象实现算法的操作 -
策略模式使用时必须首先创建策略对象作为参数传递进去,通过该对象调用不同的算法。
六、工厂方法模式和简单工厂模式的区别
-
简单工厂模式
-
工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
-
客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
-
工厂方法模式
-
客户端不知道它所需要的对象的类。
-
抽象工厂类通过其子类来指定创建哪个对象。
七、总结
创建型模式对类的实例化过程进行了抽象,能够将对象的创建与对象的使用过程分离。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
简单工厂模式适用场景:工厂类负责创建的对象比较少;客户端只知道传入工厂类的参数,对于如何创建对象不关心。
– END –
原文始发于微信公众号(星河之码):设计模式(2):简单工厂模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27211.html