欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 简单工厂模式

程序员文章站 2022-07-14 21:33:12
...

简单工厂模式:又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。

简单工厂模式UML图

Java 简单工厂模式

Client:客户端,调用工厂类的createProduct()方法来创建产品实例。
Factory: 工厂类,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法createProduct()可以被外界直接调用,创建所需的产品对象。
Product:抽象的产品类。
ProductA,ProductB:具体的产品实现类。

简单工厂模式简单实现
有卖披萨的,有卖肉夹馍的,还有生产电脑的,这里还是卖披萨吧。
假如你有一个披萨店卖披萨。客户点披萨的时候可能代码会是这样。

 public Pizza orderPizza() {
         //现在只有一种披萨类型
        Pizza pizza = new Pizza();
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

当随着时间的推移,你可能会增加几种类型的披萨,这时候,客户点披萨的代码可能就变成下面这样了。

 public Pizza orderPizza(String type) {
       Pizza pizza ;
       if (type.equals("cheese")){
           pizza=new CheesePizza();
       }else if (type.equals("greek")){
           pizza=new GreekPizza();
       }else if (type.equals("pepperoni")){
           pizza=new PepperoniPizza();
       }
       pizza.prepare();
       pizza.bake();
       pizza.cut();
       pizza.box();
       return pizza;
   }

然后随着时间的推移,你又增加了几种不同类型的披萨,同时又得把销售量不好的披萨果断从菜单中去掉。然后点披萨的代码又变了。

public Pizza orderPizza(String type) {
        Pizza pizza;
        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

很明显,当披萨类型改变的时候,点披萨的逻辑就得修改,来根据类型,创建具体的披萨。orderPizza( )方法无法对修改关闭。最好是能够将创建披萨的逻辑移到orderPizza方法之外。就是说由另外一个对象专职来创建披萨。我们称这个对象为“工厂”,来处理创建对象的细节(客户,这里就是PizzaStore,并不关心),当需要披萨的时候,就让工厂来做一个披萨。

建立一个简单的披萨工厂

public class SimplePizzaFactory {

    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if (type.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (type.equals("pepperoni")) {
            pizza = new PepperoniPizza();
        } else if (type.equals("clam")) {
            pizza = new ClamPizza();
        } else if (type.equals("veggie")) {
            pizza = new VeggiePizza();
        }
        return pizza;
    }
}

把创建披萨的代码包装进SimplePizzaFactory ,当以后实现改变时,只需修改这个类即可。
现在我们的披萨店的代码也要变了。

public class PizzaStore {

    private SimplePizzaFactory factory;

    public PizzaStore(SimplePizzaFactory factory) {
        this.factory = factory;
    }

    public Pizza orderPozza(String type) {
        //工厂负责处理创建对象的细节
        Pizza pizza = factory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

在上面的实现中,可以把Pizza定义成一个抽象类,其他的披萨类继承Pizza类。

public  abstract class Pizza {

    protected void prepare() {

    }

    protected void bake() {

    }

    protected void cut() {

    }

    protected void box() {

    }

}

具体的产品实现类

public class ClamPizza extends Pizza {

}

public class PepperoniPizza extends Pizza {

}

使用简单工厂模式的场景

  1. 工厂类负责创建的对象比较少。
  2. 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。

简单工厂模式优点

使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性。

简单工厂模式缺点

可实例化的类型在编译期间已经被确定,如果增加新类型,则需要修改工厂,违背了开放封闭原则(ASD) 。 简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

结尾:参考链接
【1】http://blog.csdn.net/itachi85/article/details/50651177
【2】Head First 设计模式

相关标签: java 工厂模式