第一、简单工厂模式:
有三种组件,一个接口,n个实现类,一个工厂类。在创建对象的时候,利用简单工厂模式,可以根据传参的不同,创建出不同的实现类对象。
实现步骤:
1.创建接口
2.创建n个实现类
3.创建工厂类,里面有返回值类型为接口的方法
见如下代码:
interface Sender { public void send(); } class MailSender implements Sender { public void send() { System.out.println("我是一个邮件发送者"); } } class MsgSender implements Sender { public void send() { System.out.println("我是一个短信息发送者"); } } // 创建工厂类: class SenderFactory { public Sender produce(String type) { if (type.equalsIgnoreCase("mail")) { return new MailSender(); } else if (type.equalsIgnoreCase("sms")) { return new MsgSender(); } else { System.out.println("请输入正确的类型!"); return null; } } } public class SimpleFactoryTest { public static void main(String[] args) { SenderFactory factory = new SenderFactory(); Sender sender = factory.produce("msg"); sender.send(); } }
如上,可以通过改变给工厂类的方法传递的参数来获取接口的不同实现类的实例。如果传递的参数是"mail"的话,就会创建出MailSender类的实例;传递的参数是"msg"的话,就会创建出MsgSender类的实例。
第二、工厂方法模式
在简单工厂模式的基础上,把一个可以生产各种类型对象的工厂类演变成一个个只可以生产一种类型对象的工厂类。这些工厂类都提供一个同名的方法用于生产对象,这个方法可以继承自一个公共父类或者一个公共父接口。
把上例改造下,会有一个MailSenderFactory、MsgSenderFactory,这俩工厂类都继承SenderFactory,这个类有一个produce方法。代码如下:
public class FactoryMethodTest { public static void main(String[] args) { SenderFactory mailSenderFactory = new MailSenderFactory(); mailSenderFactory.produce().send(); SenderFactory msgSenderFactory = new MsgSenderFactory(); msgSenderFactory.produce().send(); } } interface Sender { void send(); } class MailSender implements Sender { public void send() { System.out.println("我是一个邮件发送者"); } } class MsgSender implements Sender { public void send() { System.out.println("我是一个短信息发送者"); } } abstract class SenderFactory { abstract Sender produce(); } class MailSenderFactory extends SenderFactory { @Override Sender produce() { return new MailSender(); } } class MsgSenderFactory extends SenderFactory { @Override Sender produce() { return new MsgSender(); } }
如上,可以生产不同类型对象的SenderFactory被演变成一个MailSenderFactory和一个MsgSenderFactory。MailSenderFactory专门用于生成MailSender实例,MsgSenderFactory专门用于生成MsgSender实例。
3、抽象工厂模式
这个模式最为复杂,晚点再写。参考https://www.jianshu.com/p/83ef48ce635b