目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
共同点:创建一个类,对同样操作的方法接口进行封装,类似工厂管理生产线等情形。
优点:方便管理,易于拓展。
应用:数据库访问,我们只需要更换驱动包就可以。
简单工厂模式
创建一个类,对同样的操作进行封装。
示例:
公共接口:
//公共接口
public interface Send {
public void send();
}
实现类:
//发送短信
public class SmsSend implements Send {
@Override
public void send() {
System.out.println("发送短信成功");
}
}
//发送邮件
public class MailSend implements Send {
@Override
public void send() {
System.out.println("发送邮件成功");
}
}
工厂类:
//工厂类
public class SendFactory {
public Send produce(String type) {
if ("mail".equals(type)) {
return new MailSend();
} else if ("sms".equals(type)) {
return new SmsSend();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
测试:
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Send send = factory.proceMail();
send.send();
}
上面的代码就是实现简单工厂模式。每当我们创建一个发送一条信息,首先输入发送类型,然后便可以发送成功,这样人为的错误比较高,随便一个字母输入错误就失败了。接下来看工厂模式。
工厂模式
//简单工厂类
public class SimpleFactory {
//发送邮件
public Send proceMail(){
return new MailSend();
}
//发送短信
public Send proceSms(){
return new SmsSend();
}
}
测试:
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Send send = factory.proceMail();
send.send();
}
如此实现工厂模式,已经很棒了,但是违反了设计模式原则,对拓展开放,对修改关闭!最后看最优模式。
抽象工厂模式
个人觉得抽象工厂模式可以理解为是对工厂模式的二层封装。请看下面代码,以发送邮件为例。
共俩个接口,最初接口:
//公共接口
public interface Send {
public void send();
}
在增加提供一个接口:
//抽象接口
public interface Provider {
public Send produce(String type);//发送类型
}
接口的实现类
//QQ邮件实现类
public class SendMailQqImpl implements Send{
@Override
public void send() {
System.out.println("发送QQ邮件");
}
}
//126邮件实现类
public class SendMail126Impl implements Send{
@Override
public void send() {
System.out.println("发送126邮件");
}
}
工厂类;
//邮件工厂类
public class SendMailFactory implements Provider{
public Send produce(String type){
//如果 type=qq,则发送qq邮件,否则发送126邮件
if("qq".equals(type)){
return new SendMailQqImpl();
}else{
return new SendMail126Impl();
}
}
}
测试:
// 测试
public static void main(String[] args) {
Provider provider = new SendMailFactory();//实例化工厂
Send mailsend = provider.produce("qq");//得到实现方法
mailsend.send();//执行接口方法
}
以后我们在新增一个功能的话,只要创建一个实现 Send 接口的实现类,以及实现 Provider 的工厂类就可以拓展了。