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();
        }
    }

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

  • 相关阅读:
    [BTS] BizTalk WCF-SQL Adapter 高级应用
    [BTS] BizTalk EDI character set and separator settings
    [ThingWorx] Install Guideline
    [ThingWorx] Install PostgreSQL Issue
    [BTS] BizTalk EDI AS2 Error 1
    [BTS] BizTalk With EF
    [BTS] Exception occurred when persisting state to the database
    [BTS] MSDTC
    [BTS] The value "" for the property InboundId is invalid
    [Android] Android Sutdio on Surface Pro 3
  • 原文地址:https://www.cnblogs.com/zhengyuanyuan/p/10737441.html
Copyright © 2011-2022 走看看