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(); } }
这样,每次调用的时候就不用去修改,只需要新增即可