工厂模式定义
工厂模式用于实现工厂方法代替new来创建实例化对象,简单的说就是由一个工厂类根据传入的参数来选择创建哪一种的产品类
在任何需要使用多态的原理根据不同的信息生成不同的对象的场景下都可以使用工厂模式
工厂模式四个角色:
工厂类角色:是具体产品类角色直接调用者。
抽象产品角色:接口或抽象类,负责具体产品角色的定义,及与客户端的交互。
具体产品角色:被工厂类创建的对象,也是客户端实际操作对象。
客户端:调用工厂类产生实例,并调用实例的方法进行相应工作。
工厂方法模式分类:
普通工厂模式:就是建立一个工厂类,对实现了统一接口的一些类进行分实例创建
//抽象产品角色 public interface Sender { public void Send(); } //两个具体实现 public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } } public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } } //工厂类 public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("请输入正确的类型!"); return null; } } } //测试类 public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("sms"); sender.Send(); } }
多个工厂方法模式:使用普通工厂方法模式的一个缺点在于如果传递的字符串传错了之类的导致不存在,就不能正确的创建对象,因此可以对不同的实例创建不同的工厂方法
//修改上面的工厂类即可 public class SendFactory { public Sender produceMail(){ return new MailSender(); } public Sender produceSms(){ return new SmsSender(); } } //测试类 public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produceMail(); sender.Send(); } }
静态工厂模式:将上面的多个工厂方法全都定义成静态的,这样就不需要创建实例对象,直接调用就可以了
//修改上面的工厂类方法 public class SendFactory { public static Sender produceMail(){ return new MailSender(); } public static Sender produceSms(){ return new SmsSender(); } } //测试类 public class FactoryTest { public static void main(String[] args) { Sender sender = SendFactory.produceMail(); sender.Send(); } }
工厂方法缺陷:
类的创建依赖于工厂类,如果想要扩展程序,就必须对工厂类进行修改,违背了设计模式的开闭原则(对扩展开放,对修改关闭:在程序需要扩展的时候,不能去修改原有的代码)
因此我们可以扩展多个工厂类,在增加新的功能的时候增加一个工厂类就可以了,这样符合设计模式的开闭原则;这种模式称为抽象工厂模式
抽象工厂模式的设计实现
//抽象产品角色1 public interface Sender { public void Send(); } //角色1的两个实现类 public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } } public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } } //在提供一个接口用于抽象工厂类 public interface Provider { public Sender produce(); } //两个工厂类 public class SendMailFactory implements Provider { @Override public Sender produce(){ return new MailSender(); } } public class SendSmsFactory implements Provider{ @Override public Sender produce() { return new SmsSender(); } } //测试类 public class Test { public static void main(String[] args) { Provider provider = new SendMailFactory(); Sender sender = provider.produce(); sender.Send(); } }
如果现在想增加一个功能:发送及时信息,则只需要做一个实现Sender的实现类,同时做一个工厂类实现Provider就可以了,不需要改动原有的代码