Factory Method 工厂方法模式
工厂方法模式:
- 核心,定义一个创建对象的接口/抽象类,让子类来决定实例化哪一个类,使实例化延迟到子类。
当有新的产品产生时,只要按照产品接口和工厂接口来生成,就可以被客户端使用,而不必改码.
所以工厂方法模式是完全符合开闭原则的。 - 工厂方法克服了简单工厂违背开放封闭原则的缺点,又保持了封装对象创建过程的优点。
降低了客户程序和产品对象之间的耦合。
- 核心,定义一个创建对象的接口/抽象类,让子类来决定实例化哪一个类,使实例化延迟到子类。
示例类图:
示例代码:
// 产品
public interface Sender {
public void send(String msg);
}
//具体产品
public class MailSender implements Sender {
@Override
public void send(String msg) {
System.out.println("MailSender send : " + msg);
}
}
public class SmsSender implements Sender {
@Override
public void send(String msg) {
System.out.println("SmsSender send : " + msg);
}
}
// 定义一个创建对象的接口,让子类来决定实例化哪一个类,使实例化延迟到子类。
public interface SenderFactory {
public Sender getSender();
}
//具体工厂(每个具体工厂负责一个具体产品)
public class MailSenderFactory implements SenderFactory {
@Override
public Sender getSender() {
return new SmsSender();
}
}
public class SmsSenderFactory implements SenderFactory{
@Override
public Sender getSender() {
return new MailSender();
}
}
// 测试
public class FactoryTest {
public static void main(String[] args) {
FactoryMethod();
}
// 工厂方法模式测试
public static void FactoryMethod() {
SenderFactory senderFactory = new MailSenderFactory();
Sender sender = senderFactory.getSender();
sender.send("MailSenderFactory");
new SmsSenderFactory().getSender().send("SmsSenderFactory");
}
}
工厂方法是简单工厂的进一步抽象和推广,由于使用了多态性,所以每增加一个产品就要增加一个对应的产品工厂类,增加了额外的开发量。
当产品种类非常多时,就会出现大量的与之对应的工厂类,使用简单工厂模式与工厂方法模式相结合的方式可以减少工厂类:
即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。