本文共 2800 字,大约阅读时间需要 9 分钟。
简单工厂模式(静态工厂方法)是一种通过调用静态方法来创建产品对象的方法。这种方法通常由工厂类提供,根据传入的参数动态决定创建哪个具体的产品类(这些产品类继承自一个共同的父类或接口)。简单工厂模式的特点是工厂方法通常是静态的。
简单工厂模式属于创建类模式。
简单工厂模式通常包括以下几个要素:
public interface SmsService { void sendSms();}public class MontnetsSmsService implements SmsService { @Override public void sendSms() { System.out.println("通过梦网发送!"); }}public class EtonenetSmsService implements SmsService { @Override public void sendSms() { System.out.println("通过移通发送!"); }}public class SmsServiceFactory { public static SmsService getSmsService(int providerId) { SmsService ss; switch (providerId) { case 0: ss = new MontnetsSmsService(); break; case 1: ss = new EtonenetSmsService(); break; default: ss = new EtonenetSmsService(); } return ss; } public static void main(String[] args) { SmsService ss = SmsServiceFactory.getSmsService(0); // 发送短信 ss.sendSms(); }}
工厂方法模式通过定义一个工厂接口,子类可以通过实现该接口来决定实例化哪一个具体的产品类。工厂方法使实例化延迟到工厂子类,使得工厂方法控制对象创建。
工厂方法模式也属于创建类模式。
工厂方法模式的基本类图包括:
public interface SmsService { void sendSms();}public interface SmsServiceFactory { SmsService getSmsService(int providerId);}public class MontnetsSmsService implements SmsService { @Override public void sendSms() { System.out.println("通过梦网发送!"); }}public class EtonenetSmsService implements SmsService { @Override public void sendSms() { System.out.println("通过移通发送!"); }}public class SmsServiceFactoryImpl implements SmsServiceFactory { @Override public SmsService getSmsService(int providerId) { SmsService ss; switch (providerId) { case 0: ss = new MontnetsSmsService(); break; case 1: ss = new EtonenetSmsService(); break; default: ss = new EtonenetSmsService(); } return ss; } public static void main(String[] args) { // 向上转型为工程接口 SmsServiceFactory ssf = new SmsServiceFactoryImpl(); SmsService ss = ssf.getSmsService(0); // 发送短信 ss.sendSms(); }}
特性 | 简单工厂模式 | 工厂方法模式 |
---|---|---|
工厂方法是否为静态 | 静态工厂方法 | 非静态工厂方法 |
需要引入工厂接口 | 不需要工厂接口 | 需要工厂接口 |
扩展性 | 较差 | 较好 |
通过以上对比可以看出,简单工厂模式和工厂方法模式在静态工厂方法和工厂接口的引入方面存在显著区别。工厂方法模式由于引入了工厂接口,具有更好的扩展性和灵活性,适合需要动态扩展产品创建逻辑的场景。
转载地址:http://rppuk.baihongyu.com/