• 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

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

  • 相关阅读:
    spring集成 log4j + slf4j
    用Maven创建第一个web项目
    Spring mvc4 + ActiveMQ 整合
    ActiveMQ (一):安装启动及测试
    Pycharm 2017 激活码
    mahout推荐系统
    用Maven构建Mahout项目
    maven编译时出现读取XXX时出错invalid LOC header (bad signature)
    标签传播算法(Label Propagation)及Python实现
    VMware下centos7安装
  • 原文地址:https://www.cnblogs.com/songfahzun/p/4911591.html
Copyright © 2020-2023  润新知