java设计模式

java23种设计模式.(借鉴他人)

总体来说设计模式分为三大类

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

逐步分析:

1.普通工厂模式:

发送接口:

public interface Sender {
    public void  send();
}

两个实现接口的类:

public class MailSend implements Sender{
    @Override
    public void send() {
        System.out.println("发送邮件!");
    }

}
public class SmsSend implements Sender {
    @Override
    public void send() {
        System.out.println("发送短信!");
    }

}

工厂方法:

public class SendFactory {

    public Sender 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 class Test001 {
    @Test
    public void test001() {
        SendFactory factory = new SendFactory();
        Sender produce = factory.produce("mail");
        Sender produce2 = factory.produce("sms");
        System.out.println(produce);
        System.out.println(produce2);

    }

}

运行结果:

fz.song.sjms.ms001.MailSend@442c8ab0
fz.song.sjms.ms001.SmsSend@48454bc7

分析:可以创建不同的对象,但是如果字符串错了则不能创建对象.

2:多个工厂方法模式

与第一个方法区别在于工厂方法:

public class SendFactory {

    public Sender produceMailSend() {
        return new MailSend();
    }
    public Sender produceSmsSend() {
        return new SmsSend();
    }
}

测试:

    public void test001() {
        SendFactory factory = new SendFactory();
        Sender produce = factory.produceMailSend();
        Sender produce2 = factory.produceSmsSend();
        System.out.println(produce);
        System.out.println(produce2);

    }

运行结果:

fz.song.sjms.ms002.MailSend@442c8ab0
fz.song.sjms.ms002.SmsSend@48454bc7

 分析:经过这个修改,不存在传值的问题了.   

3:静态工厂方法模式  

修改工厂方法:

public class SendFactory {

    public static Sender produceMailSend() {
        return new MailSend();
    }
    public static Sender produceSmsSend() {
        return new SmsSend();
    }
}

测试方法:

public class Test001 {
    @Test
    public void test001() {
        Sender produce = SendFactory.produceMailSend();
        Sender produce2 = SendFactory.produceSmsSend();
        System.out.println(produce);
        System.out.println(produce2);

    }

}

运行结果:

fz.song.sjms.ms003.MailSend@3124805
fz.song.sjms.ms003.SmsSend@253641d6

分析:不需要新建对象,直接使用类加载方法,123相比之下,3比较常用.但是在扩展功能的时候,必将要修改以前的代码,这个是不好的.所以我们要思考,怎么去做才能在不改动源码的情况下,扩展我们的程序.于是就有了抽象工厂方法模式.

4:抽象工厂方法模式

解决方案,我们创建多个工厂类,一旦需要增加新的功能,直接增加工厂类就好了

代码:

接口

public interface Sender {
    public void  send();
}

连个实现类:

public class MailSend implements Sender{

    @Override
    public void send() {
        System.out.println("发送邮件!");
    }

}
public class SmsSend implements Sender {

    @Override
    public void send() {
        System.out.println("发送短信!");
    }

}

工厂方法的接口:

public interface Provider {
    public  Sender getSend();

}

工厂方法的实现类:

public class MailSendFactory implements Provider {

    @Override
    public Sender getSend() {
        return new MailSend();
    }

}
public class SmsSendFactory implements Provider{

    @Override
    public Sender getSend() {
        return new SmsSend();
    }

}

测试类:

public class Test001 {
    @Test
    public void test001() {

        Provider provider = new MailSendFactory();
        Sender send = provider.getSend();
        Provider provider2 = new SmsSendFactory();
        Sender send2 = provider2.getSend();
        System.out.println(send);
        System.out.println(send2);
    }

}

运行结果:


fz.song.sjms.ms003.MailSend@65c461d7
fz.song.sjms.ms003.SmsSend@53839d2e

分析:添加新的功能只需要实现功能接口和工厂方法的接口,就可以添加新的功能,不需要改动以前的代码.

例如:添加发送微信

添加实现类:

public class WeiXInSend implements Sender{

    @Override
    public void send() {
        System.out.println("发送微信");
    }

}

添加工厂方法的实现类:

public class WeixinSendFactory implements Provider {

    @Override
    public Sender getSend() {
        return new WeiXInSend();
    }

}

测试方法:

public class Test001 {
    @Test
    public void test001() {

        Provider provider = new MailSendFactory();
        Sender send = provider.getSend();
        Provider provider2 = new SmsSendFactory();
        Sender send2 = provider2.getSend();
        System.out.println(send);
        System.out.println(send2);
        Provider provider3=new WeixinSendFactory();
        Sender send3 = provider3.getSend();
        System.out.println(send3);
    }

}

运行结果:

fz.song.sjms.ms003.MailSend@1c093b3c
fz.song.sjms.ms003.SmsSend@220fee85
fz.song.sjms.ms003.WeiXInSend@5bf24008

分析:添加新的功能只要添加相应的方法和工厂方法就可以了,不用修改原代码.利于扩展.

原文地址:https://www.cnblogs.com/songfahzun/p/4911591.html