设计模式GOF23——工厂模式

简单工厂模式(Static Factory Method)是创建者模式的一种,是负责创建对象的模式。

模式的职责

工厂模式是为了实现创建对象和调用对象分离的需求。
简单工厂用来生产同一等级结构中的任意产品。(对于新增的产品需要修改已有代码)
工厂方法模式用来生产同意等级结构中的固定产品。(支持增加任意产品)
抽象工厂模式用来生产不同品种族的全部产品。(对于增加新的产品,无能为例,支持增加新的产品族)

为什么要创建和调用分离

当然是为了简化操作,为了封装型。为了把创建对象的逻辑和调用对象的逻辑分开来,对一些可能比较复杂的创建对象的操作进行封装,隔离复杂性,也保持封装性。工厂模式主要出于迪米特原则(最少知道原则)和开闭原则的考虑。

模式的实现

  1. 简单工厂模式
    创建一个创建者对象(工厂Factory),在这个对象中封装创建对象的方法。至于对象的创建,可以通过接口来定义类的种类和一些必要的方法和参数,具体对象实现接口即可。
    这样做完成了对创建和调用的分离。但是这个方法有一些不足:只能在工厂创建已知的对象创建的方法,如果需要扩展,就需要修改原有的代码,这样违反了开闭原则。
    下面是一个简单的小例子,用来方便理解
//创建对象的抽象,可以抽象对象的必要方法和变量
public interface Car {
     
    void run();
    void stop();
}
public class BYD implements Car{
     

    public void run() {
        //奔跑方法的实现
    }

    public void stop() {
        //停止方法的实现
    }

}
public class FAWVolkswagen implements Car{
     

    public void run() {
        //奔跑方法的实现
    }

    public void stop() {
        //停止方法的实现
    }
}
//创建的工厂
public class SimpleFactory {
     
    //创建实际对象的方法,具体创建方法由逻辑决定
    public Car createBYD(){
        Car c =new BYD();
        return c;
    }
    //简单工厂将不同的对象创建方法放在同一个类当中
    public Car createFAWVolkswagen(){
        Car c =new FAWVolkswagen();
        return c;
    }
}
  1. 工厂模式
    为每一个对象创建创建者对象(工厂Factory),在这个对象中封装创建对象的方法。至于对象的创建,可以通过接口来定义类的种类和一些必要的方法和参数,具体对象实现接口即可。
    这样做完成了对创建和调用的分离,也可以在一定成都上扩展型更强。但是这个方法有一些不足:它会增加更多的类,需要更多的代码,对于代码的控制和管理不方便。

一个简单的例子方便理解

//创建对象的抽象,可以抽象对象的必要方法和变量
public interface Car {
     
    void run();
    void stop();
}
public class BYD implements Car{
     

    public void run() {
        //奔跑方法的实现
    }

    public void stop() {
        //停止方法的实现
    }

}
public class FAWVolkswagen implements Car{
     

    public void run() {
        //奔跑方法的实现
    }

    public void stop() {
        //停止方法的实现
    }
}
//BYD的创建工厂
public class BYDFactory {
     
    //创建实际对象的方法,具体创建方法由逻辑决定
    public Car createBYD(){
        Car c =new BYD();
        return c;
    }

}
//FAWVolkswagen创建的工厂
public class FAWVolkswagenFactory {
     
    //工厂将不同的对象创建方法放在不同的类当中
    public Car createFAWVolkswagen(){
        Car c =new FAWVolkswagen();
        return c;
    }

}

工厂模式和简单工厂模式的比较

  • 结构复杂度
    这个方面比较,简单工厂明显占优势,简单工厂只需要一个工厂类,而工厂模式的工厂数量会随着对象的个数而增多,这无疑会使类越来越多,结构就越来越复杂。
  • 代码复杂度
    代码复杂度和结构复杂度是一个矛盾,既然简单工厂模式在结构上比较简单,那么它在代码方面肯定比工厂方法复杂(需要在更少的类里面管理更多的信息)。
  • 客户端编译难度
    工厂方法虽然在工厂类的结构上引入结构中满足了开闭原则(OCP),但是在客户端编码的时候需要对相应的工厂实例化。而简单工厂只需要实例化一个整体的工厂就足够了。
  • 管理上的难度
    这个是关键的问题。
    工厂方法的优势在于扩展性更好,但是简单工厂方式也不是没有可扩展性,只是需要修改相应的代码。虽然这样不满足开闭原则,但是设计原则是为了方便管理,而不是绝对的束缚。
    然后就是可维护性,如果工厂的创建方法需要进行修改,简单工厂只需要修改一个类的相关代码,工厂模式则可能需要修改很多类的相关代码,操作会变得相当繁琐和麻烦。
    所以,根据设计理论建议:工厂方法模式,但是在实际中一般会使用简单工厂模式。

你可能感兴趣的:(设计模式GOF23,工厂模式,设计模式)