设计模式之交给子类_FactoryMethod模式_将实例生成交给子类
1、解释
1、将实例的生成交给子类
2、父类决定实例的生成方式,但并不决定所要生成的具体的类
工厂方法(Factory Method)模式的意义是
1、定义一个创建产品的工厂接口(内部可能有多个产品)
2、将产品实例生成的交给工厂子类
3、我们通过子类工厂选择需要的产品,小米用到
好处:使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
1、普通工厂模式
1.1、创建一个接口Sender
public interface Sender {
public void Send();
}
1.2、两个实现类
1.2.1、发送实现类1MailSender
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
1.2.2、发送实现类2SmsSender
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
1.3、创建工厂类SendFactory
通过传入的字符串常亮进行匹配
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;
}
}
}
1.4、测试使用
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produce("sms");
sender.Send();
}
}
2、多个工厂方法模式
2.1、改变上面的工厂类
public class SendFactory {
public Sender produceMail(){
return new MailSender();
}
public Sender produceSms(){
return new SmsSender();
}
}
2.2、测试使用
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produceMail();
sender.Send();
}
}
3、静态工厂方法
3.1、修改静态工厂方法
public class SendFactory {
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
3.2、测试使用
public class FactoryTest {
public static void main(String[] args) {
Sender sender = SendFactory.produceMail();
sender.Send();
}
}
总结:
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
第一种:如果传入的字符串有误,不能正确创建对象,
第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
缺点:
每增加一个接口实现类,都需要在工厂类中添加对应的获取接口实现类的方法。这样就会改变代码的结构。
感兴趣的,欢迎添加博主微信,
哈,博主很乐意和各路好友交流,如果满意,请打赏博主任意金额,感兴趣的在微信转账的时候,备注您的微信或者其他联系方式。添加博主微信哦。
请下方留言吧。可与博主自由讨论哦
支付包 | 微信 | 微信公众号 |
---|---|---|