Home Archives Categories Tags

设计模式之第2章-工厂方法模式(Java实现)

发布时间: 更新时间: 总字数:1492 阅读时间:3m 作者: 分享

Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.知道是什么意思不?(PS:就算英语再好,可是你那一口纯正的Chinglish让我们也是听得醉了)。不知道吧,我给你们翻译一下,这句话的意思嘛,就是:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。还不懂?

“我先来”,“不,老公,我先!”。远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~)。“抽象工厂模式,赶紧的自我介绍,工厂方法模式,你身为男人,要懂得绅士风度,lady first懂不懂,稍后再来,急什么。”(画外音:鱼哥,这是我家祖传的小吃,还有我爹的好酒blablabla),“哎呀,那个抽象工厂模式,阿姨喊你回家吃饭了。”“哦,我去去就回,等我啊。”工厂方法,赶紧的。“等等,鱼哥,上次我还没说完,给我一分钟先,让我把应用场景给说了。”“恩,唔唔”(画外音:嘴里塞满老北京糖葫芦以及其它各色小吃的作者已被众人拖走)、、、

福利:单例模式之应用场景

在下面的情况下,就轮到我出场了:

  • 当类中只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一的实例应该是通过子类化可扩展的,并且客户应该无需要更改代码就能使用一个扩展的实例时。

好了,有关我的就此结束,工厂方法,你来吧。

工厂方法模式介绍

工厂方法模式的通用类图:

在我的模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义,Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。

工厂方法模式分析

优点:

  • 首先呢,封装性比较好,所以工厂方法使得代码结构清晰,利于维护。
  • 其次嘛,扩展性也是超赞,想增加一个产品,某问题了,不要重构,不要复杂,只需要扩展一个工实现拥抱变化。
  • 再次了,能屏蔽产品类的具体实现,使用的人不需要操心具体如何实现,只要调用接口即可,只要,那么上层模块就不会改变。
  • 最后嘛,我可是典型的解耦框架,符合传说中的迪米特法则,依赖倒置原则。

缺点:

  • 一个潜在的缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象,就不得不创建Creator的子类。

工厂方法模式之实现

美食工厂示例:

public interface Food{
     public void createFood();
}

这个Food接口是对食物的总称,每个Food都有一个制造食物的方法。

public class Tanghulu implements Food{
    public void createFood(){
        System.out.println("我是好吃的老北京糖葫芦~");
    }
}

上面的代码是生产老北京糖葫芦的。

public class Latiao implements Food{
    public void createFood(){
        System.out.println("我是好吃的卫龙辣条~");
    }
}

下面是抽象工厂的实现:

public abstract class AbstractFoodFactory{
    public abstract <T extends Food> T createFood(Class<T> c);
}

可以看到,美食工厂生产美食的方法输入参数是Food接口的实现类,这个和类图保持一致。在这里我们用了泛型,通过定义泛型,对createFood的输入差生限制,必须是Class类,必须是Food类。

下面是美食工厂的实现:

public class FoodFactory extends AbstractFoodFactory{
    public <T extends Food> T createFood(Class<T> c){
        Food food = null;
        try{
            food = (T)Class.forName(c.getName()).newInstance();
        }
        catch(Exception e){
            System.out.println("食物生产失败!");
        }
        return (T)food;
    }
}

最后是测试类,生产食物:

public class Author{
    public static void main(String[] args) {
        AbstractFoodFactory foodFactory = new FoodFactory;

        //作者大大最爱的冰糖葫芦
        Food tanghulu = foodFactory.createFood(Tanghulu.class);
        tanghulu.createFood();

        //作者喜欢的卫龙辣条~
        Food latiao = foodFactory.createFood(Latiao.class);
        latiao.createFood();
    }
}

有了这个美食工厂,作者大大再也不用担心零食了~至此,我的工厂方法模式实现结束。

参考书籍:GoF的《Design Patterns:Elements of Reusable Object-Oriented Software》

     秦小波的《The Zen of Design Patterns second Edition》

     程杰的《大话设计模式》

完毕。

最新评论
加载中...