工厂模式

工厂模式是一种常见的设计模式,它属于创建型模式。工厂模式通过将对象的实例化过程封装起来,使得客户端无需关心对象的创建,而只需要使用使用它即可。该模式能够降低代码的复杂性和耦合度,提高了系统的可维护性和可扩展性,是一种非常实用的模式。

简单工厂模式

简单工厂模式是工厂模式的一种特例,它通过增加一个工厂类,将所有产品的创建过程封装在工厂类中,由工厂类返回对应的具体产品实例。简单工厂模式的实现比较简单,但是缺点在于所有的产品类都需要聚合在一个工厂类中,当新加入一个产品类时,需要修改工厂类的代码,违反了“开闭原则”。

工厂方法模式

工厂方法模式通过将具体的工厂类封装在抽象工厂中,使得客户端只和抽象工厂交互。具体的工厂类负责创建具体的产品类,但是具体的实例化操作在工厂类中并不实现,而是由具体的产品类去实现。工厂方法模式相对于简单工厂模式,优点在于增加新的产品时无需修改抽象工厂类代码,而只需要增加一个具体的工厂类和相应的产品类即可,符合“开闭原则”。

抽象工厂模式

抽象工厂模式是工厂方法模式的扩展,它通过增加一个抽象工厂,将具体工厂类抽象出来,使得抽象工厂中可以创建多个产品组,而工厂方法模式只能创建一个产品。抽象工厂模式相对于工厂方法模式,在实现时更为复杂,但也具有更多的灵活性和可扩展性。

Java示例

以工厂方法模式为例,我们来演示一下工厂模式。假设我们需要创建一个手机类,它可以是苹果、三星、华为等类型的手机,同时我们需要这些手机都具有统一的属性和方法。我们首先定义一个抽象类Phone

public abstract class Phone {
    public abstract void make();
}

然后,我们可以定义具体的手机类IPhoneSamsungPhoneHuaweiPhone,继承自Phone抽象类,并实现make方法:

public class IPhone extends Phone{
    public void make(){
        System.out.println("IPhone is made.");
    }
}

public class SamsungPhone extends Phone{
    public void make(){
        System.out.println("SamsungPhone is made.");
    }
}

public class HuaweiPhone extends Phone{
    public void make(){
        System.out.println("HuaweiPhone is made.");
    }
}

接着,我们定义一个工厂抽象类PhoneFactory,它负责创建具体手机的实例对象:

public abstract class PhoneFactory {
    public abstract Phone createPhone();
}

然后,我们定义具体的工厂类,如IPhoneFactorySamsungPhoneFactoryHuaweiPhoneFactory等,继承自PhoneFactory抽象类,并实现createPhone方法,返回相应的具体手机实例:

public class IPhoneFactory extends PhoneFactory{
    public Phone createPhone(){
        return new IPhone();
    }
}

public class SamsungPhoneFactory extends PhoneFactory{
    public Phone createPhone(){
        return new SamsungPhone();
    }
}

public class HuaweiPhoneFactory extends PhoneFactory{
    public Phone createPhone(){
        return new HuaweiPhone();
    }
}

最后,在客户端代码中,我们可以使用具体的工厂类来创建具体的手机实例:

PhoneFactory factory = new IPhoneFactory();
Phone phone = factory.createPhone();
phone.make();

这样就完成了工厂方法模式的Java演示。

优点和缺点

优点:

  1. 工厂模式将对象的创建和使用分离,降低了客户端与具体实现类的耦合度,提高了系统的灵活性和可维护性;
  2. 工厂模式能够在一个系统中为不同的具体产品提供同一个抽象接口,使得客户端更加方便地使用这些产品;
  3. 工厂模式能够保证系统中的每个具体产品都具有相同的接口和属性,使得系统更加易于扩展和维护。

缺点:

  1. 工厂模式每增加一个产品都需要增加一个对应的具体工厂类,导致系统中的工厂类的数量增加,代码复杂度增大;
  2. 工厂模式虽然降低了客户端与具体实现类的耦合度,但是增加了抽象层,导致系统更加抽象和难以理解和把握;
  3. 工厂模式将创建具体产品的任务全部交给工厂类,使得工厂类承担了太多的责任,增加了工厂类的复杂度和难度。

综上所述,工厂模式是一种非常实用的设计模式,它能够为系统提供灵活性、可维护性和可扩展性。在使用时,需要根据具体的情况进行选择,遵循相应的规范和要求,才能发挥出工厂模式的优点。