工厂方法模式(Factory Pattern)

工厂方法模式(Factory Pattern),定义一个用于创建对象的接口,让子类决定具体实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 

通俗的讲,新建实例对象交给一个特定的工厂类去完成,如果需要更换实例对象,只要替换掉工厂类就可以了。

 

我们想生产一个手机,假设可以有两种选择,一个是IPhone,一个是Huawei,这两种手机都具有手机的基本功能(实现了Phone接口)。

public interface Phone {
    void talk();
    void playGames();
}
public class IPhone implements Phone {

    @Override
    public void talk() {
        System.out.println("balabala...");
    }

    @Override
    public void playGames() {
        System.out.println("Play...");
    }
}
public class Huawei implements Phone {
    @Override
    public void talk() {
        System.out.println("打电话");
    }

    @Override
    public void playGames() {
        System.out.println("玩游戏");
    }
}

 

现在开始建造这IPhone工厂和Huawei工厂,这两个工厂都实现了Factory接口,具有生产手机的能力

public interface PhoneFactory {

    Phone createPhone();

}
public class IPhoneFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        return new IPhone();
    }
}
public class HuaweiFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        return new Huawei();
    }
}

 

现在工厂已经建造好了,可以开始生产手机了

    public static void main(String[] args) {
        //IFactory factory = new HuaweiFactory();       //生产华为手机的工厂
        IFactory factory = new IPhoneFactory();         //只需要把工厂替换为IPhone手机工厂
        ...                           //需要其他手机,只需要实例化其他手机工厂
        //其余代码不需要更改
        Phone phone = factory.createPhone();    
        phone.playGames();
        phone.talk();
    }

 

1,工厂方法模式完全符合“开-闭原则”,可扩展,不必修改之前的代码。

2,父类负责制定规则,子类负责具体实现,是很典型的模板方法模式。但是工厂方法模式用于生产实例,模板方法模式偏于子类实现具体逻辑。

3,新手学习时,不必纠结于父类是抽象类还是接口,使用抽象类还是接口,要看具体的业务。

 

posted @ 2018-12-18 10:12  dioag  阅读(116)  评论(0编辑  收藏  举报