工场要领形式(Factory Method)
工场要领形式分为三种:
1、一般工场形式,就是竖立一个工场类,对完成了统一接口的一些类举行实例的建立。起首看下关联图:
举例以下:(我们举一个发送邮件和短信的例子)
起首,建立两者的配合接口:
public interface Sender { public void Send(); }
其次,建立完成类:
public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } }
public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } }
末了,建工场类:
public class SendFactory { public Sender produce(String type) { if ("mail".equals(type)) { return new MailSender(); } else if ("sms".equals(type)) { return new SmsSender(); } else { System.out.println("请输入准确的范例!"); return null; } } }
我们来测试下:
public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produce("sms"); sender.Send(); } }
输出:
this is sms sender!
2、多个工场要领形式,是对一般工场要领形式的革新,在一般工场要领形式中,假如通报的字符串失足,则不能准确建立对象,而多个工场要领形式是供应多个工场要领,离别建立对象。关联图:
将上面的代码做下修正,修改下SendFactory类就行,以下:
public class SendFactory { public Sender produceMail(){ return new MailSender(); } public Sender produceSms(){ return new SmsSender(); } }
测试类以下:
public class FactoryTest { public static void main(String[] args) { SendFactory factory = new SendFactory(); Sender sender = factory.produceMail(); sender.Send(); } }
输出:
this is mailsender!
3、静态工场要领形式,将上面的多个工场要领形式里的要领置为静态的,不须要建立实例,直接挪用即可。
public class SendFactory { public static Sender produceMail(){ return new MailSender(); } public static Sender produceSms(){ return new SmsSender(); } }
public class FactoryTest { public static void main(String[] args) { Sender sender = SendFactory.produceMail(); sender.Send(); } }
输出:
this is mailsender!
整体来讲,工场形式合适:通常涌现了大批的产物须要建立,而且具有配合的接口时,能够经由过程工场要领形式举行建立。在以上的三种形式中,第一种假如传入的字符串有误,不能准确建立对象,第三种相对于第二种,不须要实例化工场类,所以,大多数情况下,我们会选用第三种——静态工场要领形式。
4、笼统工场形式(Abstract Factory)
工场要领形式有一个题目就是,类的建立依靠工场类,也就是说,假如想要拓展顺序,必需对工场类举行修正,这违犯了闭包准绳,所以,从设想角度斟酌,有肯定的题目,怎样处理?就用到笼统工场形式,建立多个工场类,如许一旦须要增添新的功用,直接增添新的工场类就能够了,不须要修正之前的代码。由于笼统工场不太好明白,我们先看看图,然后就和代码,就比较轻易明白。
请看例子:
public interface Sender { public void Send(); }
两个完成类:
public class MailSender implements Sender { @Override public void Send() { System.out.println("this is mailsender!"); } }
public class SmsSender implements Sender { @Override public void Send() { System.out.println("this is sms sender!"); } }
两个工场类:
public class SendMailFactory implements Provider { @Override public Sender produce(){ return new MailSender(); } }
public class SendSmsFactory implements Provider{ @Override public Sender produce() { return new SmsSender(); } }
在供应一个接口:
public interface Provider { public Sender produce(); }
测试类:
public class Test { public static void main(String[] args) { Provider provider = new SendMailFactory(); Sender sender = provider.produce(); sender.Send(); } }
实在这个形式的优点就是,假如你现在想增添一个功用:发实时信息,则只需做一个完成类,完成Sender接口,同时做一个工场类,完成Provider接口,就OK了,无需去修改现成的代码。如许做,拓展性较好!
ki4网,大批的免费Java入门教程,迎接在线进修!
以上就是java什么是工场形式的细致内容,更多请关注ki4网别的相干文章!