工厂方法模式
1 适用场景
(1) 需要创建多个兄弟类的多个模板对象,若不抽取出来,会产生大量相似对象
(2)应用层不依赖产品类被创建,以及实现的细节
(3)一个类(接口)通过其子类(实现类)里指定创建哪一个子类。
2 UML图
如图所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NVDYFZ4-1641836450917)(C:\Users\张权\AppData\Roaming\Typora\typora-user-images\image-20220110224525331.png)]
可以看到四个角色:
(1) 抽象工厂(Factory):不依赖于程序,只要实现工厂方法模式,则这个接口必须实现,至少应包含一个create()抽象方法。
(2) 工厂(ConcreteFactory):抽象工厂的实现类,包含应用程序密切相关的逻辑,并被应用程序调用以创建产品对象。
(3)抽象产品(Product):将于抽象工厂是一对一的,意味着,一个抽象工厂只能生产一种抽象产品。
(4)产品(ConcreteProduct):与工厂一对一关系,一个具体工厂只能生产一个产品。
3 工厂方法模式用以解决扩展问题
随着产品的增加,使用简单工厂模式创建对象就会变得越来越臃肿;单一职责原则要求,每一个类只做一件事,我们每一个工厂只实现某一个(某一组)对象的创建,抽象工厂一对一抽象产品组。
我们先来创建抽象工厂类:
public interface IMessageFactory {
IMessage create();
}
然后具体工厂类:
public class EmailMessageFactory implements IMessageFactory{
@Override
public IMessage create() {
return new EmailMessage();
}
}
public class SMSMessageFactory implements IMessageFactory{
@Override
public IMessage create() {
return new SMSMessage();
}
}
抽象产品类:
public interface IMessage {
void send();
}
具体产品类:
public class EmailMessage implements IMessage{
@Override
public void send() {
System.out.println("发送邮件");
}
}
public class SMSMessage implements IMessage{
@Override
public void send() {
System.out.println("发送短信");
}
}
测试类:
public class FactoryTest {
public static void main(String[] args) {
IMessageFactory smsFactory=new SMSMessageFactory();
IMessage sms=smsFactory.create();
sms.send();
}
}
5 在源码中用到的类:
ILogFactory中使用到了工厂方法模式
引用文章:工厂方法模式在源码中的应用