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

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

posted @ 2019-04-19 17:38  十黎九夏  阅读(438)  评论(0编辑  收藏  举报