简单工厂设计模式主要应用了里氏代换原则,即子类可以替换其父类。接口可以被看做是父类,由于子类实现了接口当中的方法,因此可以将实现接口的具体实例看做是接口类型的对象。这样为程序提供了良好的可维护性和可扩展性。
简单工厂设计模式分为三种
- 普通:创建工厂类,返回实现了同一个接口的具体的实例。工厂类的方法返回的是接口类型,但是返回值根据不同的参数决定返回具体哪些实例。
我们以发送邮件和短信为例,两个类都实现了send方法。可以创建一个工厂,根据不同的发送请求返回不同的具体实例。再根据这些实例进行相应的操作。具体代码如下:
Sender接口:/** * @author 123 * @create 2019/5/1 */ public interface Sender { void send(); }
MailSender类:
/** * @author 123 * @create 2019/5/2 */ public class MailSender implements Sender { @Override public void send() { System.out.println("发送电子邮件"); } }
SmsSender类:
/** * @author 123 * @create 2019/5/2 */ public class SmsSender implements Sender { @Override public void send() { System.out.println("发送短信"); } }
Factory类:
/** * @author 123 * @create 2019/5/2 */ public class Factory { public static Sender produce(String type) { switch (type) { case "mail": return new MailSender(); case "sms": return new SmsSender(); default: return null; } } }
测试类:
/** * @author 123 * @create 2019/5/2 */ public class FactoryTest { public static void main(String[] args) { Sender smsSender = Factory.produce("sms"); smsSender.send(); } }
运行结果:
发送短信
- 多个方法:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象
工厂类代码:
测试类代码:/** * @author 123 * @create 2019/5/2 */ public class Factory { public Sender produceMail() { return new MailSender(); } public Sender produceSms() { return new SmsSender(); } }
运行结果:/** * @author 123 * @create 2019/5/2 */ public class FactoryTest { public static void main(String[] args) { Sender mailSender = new Factory().produceMail(); mailSender.send(); } }
发送电子邮件
- 多个静态方法:工厂当中的所有方法均是静态的,无需创建对象,直接调用即可。
工厂类代码:/** * @author 123 * @create 2019/5/2 */ public class Factory { public static Sender produceMail() { return new MailSender(); } public static Sender produceSms() { return new SmsSender(); } }
测试类代码:
/** * @author 123 * @create 2019/5/2 */ public class FactoryTest { public static void main(String[] args) { Sender mailSender = Factory.produceMail(); mailSender.send(); } }
运行结果:
发送电子邮件
总结:工厂是用来生产产品的(对象),当我们需要创建某些对象的时候,有时却不适宜直接使用new关键字创建(多态)。而把创建对象的工作交给工厂去处理。上面的第一种,我们通过判断参数来创建对象。它的一个弊端是当参数不符合要求时就无法创建所需的对象,第二种和第三种是对第一种的改进。第三种使用静态的方式省去了创建工厂对象的麻烦,直接通过类去调用即可。因此我们经常使用第三种的方式去创建对象。