zoukankan      html  css  js  c++  java
  • java实现23种设计模式之普通工厂模式和抽象工厂模式

    package com.ceshi2;
    
    /**
     * 举一个发送邮件和短信的例子
     * @author Administrator
     *
     */
    public interface Sender {
        public void Send();
    }

    创建一个接口,分别有短信和邮件实现这个接口

    package com.ceshi2;
    
    public class MailSender implements Sender{
    
        @Override
        public void Send() {
            System.out.println("this is mail sender");
        }
    
    }
    package com.ceshi2;
    
    public class SmsSender implements Sender{
    
        @Override
        public void Send() {
            System.out.println("this is sms sender");
        }
    
    }

    创建一个静态工厂方法模式,可以在调用的时候不用对工厂类实例化

    package com.ceshi2;
    
    public class SendFactory {
        
        public static Sender produceMail(){
            return new MailSender();
        }
        
        public static Sender produceSms(){
            return new SmsSender();
        }
    }

    测试

    package com.ceshi2;
    
    public class FactoryTest {  
          
        public static void main(String[] args) {      
            Sender sender = SendFactory.produceMail();  
            sender.Send();  
        }  
    }

    结果:

    想想普通工厂模式,假如需要新建立一个发送传真的方法呢。

    需要先建立一个实现接口的类,然后在工厂类使用方法进行实例化。这就需要对工厂类进行修改,违背了闭包原则。

    所以可以用

    抽象工厂模式(Abstract Factory)

    接口和实现类不做修改,新建一个接口和两个工厂类

    package com.ceshi2;
    
    public interface Provider {
        public Sender produce();
    }
    package com.ceshi2;
    
    public class SendMailFactory implements Provider {
        @Override
        public Sender produce() {
            return new MailSender();
        }
    }
    package com.ceshi2;
    
    public class SendSmsFactory implements Provider{
        @Override
        public Sender produce() {
            return new SmsSender();
        }
    }
    public class Test {
    
        public static void main(String[] args) {
            Provider provider = new SendMailFactory();
            Sender sender = provider.produce();
            sender.Send();
        }
    }

    这样,每次调用的时候就不用去修改,只需要新增即可

  • 相关阅读:
    flink-sql-client使用kafka表格
    flink 使用sql实现kafka生产者和消费者
    利用scan迁移部分单点redis数据到RedisCluster
    flink按事件时间排序
    Linux下面 多线程死锁问题的调试
    大数据开发工具漫谈
    如何撰写一个分布式计算平台的作业调度器?
    (随用随总结)Linux下面的特殊权限&不同的文件类型
    【javascript小案例】从0开始实现一个俄罗斯方块
    mysqldumpslow简单使用方法-mysqldumpslow详细用法
  • 原文地址:https://www.cnblogs.com/zhengyuanyuan/p/10737441.html
Copyright © 2011-2022 走看看