工厂模式
工厂:一个生产东西的地方。在java中就是创建实例的地方。通常,在我们需要实例化一个对象的时候,我们会使用new关键字。如果我们创建一个类,让这个类给我们一个实例化对象,那么这个类就是工厂类了。
简单工厂模式
interface Sender {
public void send();
}
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is mailsender!");
}
}
class SmsSender implements Sender {
@Override
public void send() {
System.out.println("this is sms sender!");
}
}
class SendFactory {
public Sender produceMail(){
return new MailSender();
}
public Sender produceSms(){
return new SmsSender();
}
}
public class SimpleFactory {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produceMail();
sender.send();
}
}
已发送邮件和短信为例,SendFactory负责帮我们生成短信类或者邮件的实例,通过调用SendFactory的不同方法,我们可以得到想要的对象。
如果我们在工厂的所有方法都用static修饰,那么我们就不在需要实例化工厂类了,这就是静态工厂方法模式。
简单工厂组成:
工厂类角色:生产产品的地方。在java中它往往由一个具体类实现。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
工厂方法模式
在简单工厂模式中,SendFactory负责创建我们需要的对象实例,如果我现在想发送邮件信息怎么办?简单,创建一个邮件类,然后在SendFactory加上一个创建返回邮件对象的方法就行了。这意味着我们在进行拓展的时候需要修改SendFactory类,这违背了开闭原则。咋办?于是就产生了工厂方法模式。
interface Sender {
public void send();
}
class MailSender implements Sender {
@Override
public void send() {
System.out.println("this is mailsender!");
}
}
class SmsSender implements Sender {
@Override
public void send() {
System.out.println("this is sms sender!");
}
}
interface Provider {
public Sender produce();
}
class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
public class FactoryMethod {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.send();
}
}
创建一个Provider接口,这个接口的作用就是提供一个product()方法约束实现了这个接口的类。只要类实现了Provider就必须要重写product()方法,所以,实现了Provider接口的类都是一个生产者,也就是我们的工厂。现在,我如果要改为发送扣扣,只需要创建一个实现了Sender接口的扣扣类和一个返回扣扣类的工厂就可以了。
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
工厂方法模式组成:
抽象工厂角色: 具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
至此可以看出,工厂方法模式是简单工厂模式的进一步抽象,将具体的工厂类抽象出一个接口,从而派生出多个具体工厂类。
抽象工厂模式:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。