工厂方法(Factory Method)

来源:互联网 发布:淘宝首页添加旺旺 编辑:程序博客网 时间:2024/05/08 10:06

工厂方法(Factory Method)  在工作中的也是很常见的。

使用场景:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。

特点:

1,被创建对象的类实现共同的接口(程序运行时期动态绑定具体哪个类)

2,工厂:提供创建对象的方法(根据不同的标示,或者提供不同的方法对不同的类进行创建)

3,client:持有工厂或者调用工厂不同的静态方法实现对不同类型的类进行实例化。

工厂方法有三种变形普通工厂,多方法工厂,静态工厂
在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,
所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

缺点:如果添加一个被创建的类必须要修改工厂类,添加一个新的方法

UML类图:


实现:

/** * 被创建的类实现的接口 */public interface Sender {    public void send();}

public class SmsSender implements Sender {    @Override    public void send() {        System.out.println("sms send method");    }}
public class MailSender implements Sender {    @Override    public void send() {        System.out.println("mail send method");    }}
/** * 普通工厂 */public class SendFactory {    /**     * 通过传入的type进行判断具体需要实例化哪个类     */    public Sender produce(String type){        Sender sender=null;        if("mail".equals(type)){            sender = new MailSender();        }else if("sms".equals(type)){            sender = new SmsSender();        }else{            System.out.println("没有此类型");        }        return sender;    }}
/** * 多方法工厂 */public class SendFactory2 {    //为每一个类创建一个实例化的方法    public Sender produceMail(){        return new MailSender();    }    public Sender produceSms(){        return new SmsSender();    }}
/** * 静态工厂 */public class SendFactory3 {    public static Sender produceMail(){        return new MailSender();    }    public static Sender produceSms(){        return new SmsSender();    }}

/** * Created by lyyz on 2017/7/12. */public class FactoryTest {    public static void main(String[] args) {        //普通工厂模式        SendFactory sendFactory = new SendFactory();        Sender sender = sendFactory.produce("mail");        sender.send();        //多方法工厂模式        SendFactory2 sendFactory2 = new SendFactory2();        Sender sender2 = sendFactory2.produceMail();        sender2.send();        //静态工厂模式        Sender sender3 = SendFactory3.produceMail();        sender3.send();    }}


如果有不足之处请多多指教,谢谢!