zoukankan      html  css  js  c++  java
  • Java设计模式---工厂方法模式(Factory-Method)

    一、普通工厂模式
    建立一个工厂类,对实现了同一接口的一些类进行实例的创建
    实例代码:
    发送短信和邮件的例子,首先创建接口:

    public interface Sender {
       
    	public void send();
    	
    }
    
    分别完成实现类:

    短信发送实现类:

    public class SmsSender implements Sender{
       
    	@Override
    	public void send() {
    		
    		System.out.println("发送sms消息");
    		
    	}
    	
    }
    
    邮件发送实现类:

    public class MailSender implements Sender{
     
    	@Override
    	public void send() {
    		
    		System.out.println("发送email消息");
    		
    	}
    	
    }

    工厂类:

    public class OrdinarySenderFactory {
        
    	public  Sender createSender(String type){
    		
    		if("sms".equals(type)){
    			return new SmsSender();
    		}else if("mail".equals(type)){
    			return new MailSender();
    		}else{
    			System.out.println("请输入正确的类型");
    			return null;
    		}
    		
    	}
    }

    测试类:

    public class TestFactory {
       
    	public static void main(String[] args) {
    		OrdinarySenderFactory senderFactory=new OrdinarySenderFactory();
    		Sender sender=senderFactory.createSender("sms");
    		sender.send();
    	}
    }
    运行输出:发送sms消息

    在上述的工厂方法中,如果出现传递的字符串参数出现错误,则不能正确的创建对象,所以衍生出新的创建方式——多个工厂方法模式

    工厂类如下:

    public class OrdinarySenderFactory {
        
    	public Sender cresteSmsSender(){
    		return new SmsSender();
    	}
    	
    	public Sender createmailSender(){
    		return new MailSender();
    	}
    	
    }

    二、静态工厂方法模式

    将上述的多个工厂方法模式里的方法修改成静态方法,这样就不需要单独创建工厂类实例,直接可调用,工厂类如下:

    public class OrdinarySenderFactory {
        
    	public static Sender cresteSmsSender(){
    		return new SmsSender();
    	}
    	
    	public static  Sender createmailSender(){
    		return new MailSender();
    	}
    	
    }
    测试类:

    public class TestFactory {
       
    	public static void main(String[] args) {
    		Sender sender1=OrdinarySenderFactory.createmailSender();
    		sender1.send();
    	}
    }
    总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
    三、抽象工厂模式(abstract factory)

    考虑一个问题,如果在上述多个工厂方法模式的基础上,需要再加一个发送站内信的功能 messageSender ,那么就需要修改工厂类,在类中增加一个创建messageSender实例的方法。虽然这是可行的,但是这违背了闭包原则(对拓展开放,对修改关闭)。所以,这里就需要用到抽象工厂了,创建一个抽象工厂,所有的工厂都实现这个工厂的对象实例创建方法,这样在要加入新的功能,只需要加入新的工厂类就可以了,不需要修改原来的代码。

    发送短信和邮件的例子,首先创建接口:

    public interface Sender {
       
    	public void send();
    	
    }
    
    
    分别完成实现类:

    短信发送实现类:

    public class SmsSender implements Sender{
       
    	@Override
    	public void send() {
    		
    		System.out.println("发送sms消息");
    		
    	}
    	
    }
    
    
    邮件发送实现类:

    public class MailSender implements Sender{
     
    	@Override
    	public void send() {
    		
    		System.out.println("发送email消息");		
    	}	
    }
    抽象工厂类:

    public interface SendProvider {
       
    	public Sender createSender();
    	
    }
    实现了抽象工厂类的2个具体实现类:

    public class SmsSenderFactory implements SendProvider {
    
    	@Override
    	public Sender createSender() {
    		return new SmsSender();
    	}
    
    }
    public class MailSenderFactory implements SendProvider{
    
    	@Override
    	public Sender createSender() {
    		return new MailSender();
    	}
    
    }
    测试代码:
    public class TestFactory {
       
    	public static void main(String[] args) {	
    		SendProvider provider=new SmsSenderFactory();
    		Sender sender=provider.createSender();
    		sender.send();
    	}
    }
    这样如果需要加入messageSender。只需要额外加入实现了Sender接口的MessageSender实现类和实现了SenderProvider抽象工厂的工程类就可以了。


    本文参照资料:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html


  • 相关阅读:
    【NOIP2013】花匠
    【DP合集】tree-knapsack
    【DP合集】m-knapsack
    【DP合集】背包 bound
    【DP合集】合并 union
    【DP合集】棋盘 chess
    BZOJ1026 [SCOI2009]windy数
    最长上升子序列 LIS nlogn
    再谈线性基
    数论问题算法模板
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293774.html
Copyright © 2011-2022 走看看