Java设计模式-简单工厂模式/工厂模式/抽象工厂模式

目录

简单工厂模式

工厂模式

抽象工厂模式

上述代码 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 的工厂类就可以拓展了。

上述代码 GitHub 地址:https://github.com/baicun/designPatterns

猜你喜欢

转载自blog.csdn.net/csdn_0911/article/details/84728350
今日推荐