一、概述
工厂模式主要用于实例化统一接口的对象,并且可以动态决定对象属于哪一类型
二、代码
1.普通工厂:实例化后一个工厂类,调用非静态方法,根据传入不同的参数,进行实例化不同的对象
public interface Sender {
void send();
}
public class MailSender implements Sender{
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("发送了一封邮件");
}
}
public class SmsSender implements Sender{
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("发送了一条消息");
}
}
/*普通工厂*/
public class SendFactory {
public Sender newInstance(String msg){
if("mail".equals(msg)){
return new MailSender();
}else if("sms".equals(msg)){
return new SmsSender();
}
return null;
}
}
public class Test {
public static void main(String[] args) {
SendFactory sf = new SendFactory();
MailSender mailSender = (MailSender) sf.newInstance("mail");
SmsSender smsSender = (SmsSender) sf.newInstance("sms");
mailSender.send();
smsSender.send();
}
}
2.静态工厂:与普通工厂不同的是,工厂类实例化对象的方法为静态的,可以直接不用实例化对象即可实例化不同对象
/*静态工厂*/
public class SendFactory {
public static Sender newMailInstance(){
return new MailSender();
}
public static Sender newSmslInstance(){
return new SmsSender();
}
}
public class Test {
public static void main(String[] args) {
MailSender mailSender = (MailSender) SendFactory.newMailInstance();
SmsSender smsSender = (SmsSender) SendFactory.newSmslInstance();
mailSender.send();
smsSender.send();
}
}
3.多个工厂:通过一个工厂类中不同的方法生成不同对象的实例化对象
/*多个工厂*/
public class SendFactory {
public Sender newMailInstance(){
return new MailSender();
}
public Sender newSmslInstance(){
return new SmsSender();
}
}
public class Test {
public static void main(String[] args) {
SendFactory sf = new SendFactory();
MailSender mailSender = (MailSender) sf.newMailInstance();
SmsSender smsSender = (SmsSender) sf.newSmslInstance();
mailSender.send();
smsSender.send();
}
}
4.抽象工厂:将工厂类抽象出为一个接口,并且不同类型的对象有不同的工厂类并且实现接口的方法
/*抽象工厂*/
public interface Provider {
Sender newInstance();
}
public class MailFactory implements Provider {
@Override
public Sender newInstance() {
return new MailSender();
}
}
public class SmsFactory implements Provider {
@Override
public Sender newInstance() {
return new SmsSender();
}
}
public class Test {
public static void main(String[] args) {
Provider smsProvider = new SmsFactory();
Provider mailProvider = new MailFactory();
SmsSender smsSender = (SmsSender)smsProvider.newInstance();
MailSender mailSender = (MailSender)mailProvider.newInstance();
smsSender.send();
mailSender.send();
}
}