工厂模式

发布时间: 更新时间: 总字数:890 阅读时间:2m 作者: IP上海 分享 网址

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

工厂方法模式介绍

  • 使用场景:不同条件下创建不同实例
  • 工厂方法模式的通用类图:

factory-method

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

工厂方法模式分析

优点:

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

缺点:

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

示例

Golang 示例

Java 示例

美食工厂示例:

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();
    }
}
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数