目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
工厂模式
创建一个类,对同样操作的方法接口进行封装,类似工厂管理生产线等情形。
工厂模式优点
方便管理,易于拓展。
工厂模式应用
数据库访问,我们只需要更换驱动包就可以。
工厂模式实例
工厂模式
定义了一个创建对象的类,由这个类来封装实例化不同对象,采用if-else判断。
类图:
示例:
公共接口:
//公共接口
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) {
SendFactory factory = new SendFactory();
Send s = factory.produce(sendType());
s.send();
}
//客户端输入发送类型
private static String sendType() {
try {
BufferedReader write = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入发送类型!:");
String str = write.readLine();
return str;
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
上面的代码就是实现简单工厂模式。每当我们创建一个发送一条信息,首先输入发送类型,然后便可以发送成功,这样人为的错误比较高,随便一个字母输入错误就失败了。接下来看工厂模式。
简单工厂模式
定义了一个创建对象的抽象方法,由子类决定要实例化的类。
类图:
//简单工厂类
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 SendSmsImpl implements Send {
@Override
public void send() {
System.out.println("发送短信,到SC");
}
}
工厂类;
核心:
//短信工厂类
public class SendSmsFactory implements Provider {
@Override
public Send produce(String type) {
return new SendSmsImpl();
}
}
//邮件工厂类
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 的工厂类就可以拓展了。