Java 简单工厂模式

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

简单工厂模式UML图

这里写图片描述

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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
简单工厂模式是一种创建型设计模式,它通过一个工厂类来封装对象的创建逻辑。客户端只需要调用工厂类的静态方法,传入指定的参数或条件,即可获取所需的具体产品对象,而无需直接实例化具体产品类。这种方式可以隐藏产品对象的创建细节,提供了一种简单、统一的接口来创建对象。 在Java中,我们可以通过以下步骤来实现简单工厂模式: 1. 创建一个抽象产品类(Product),定义产品的共同接口。 2. 创建具体产品类(ConcreteProduct),实现抽象产品类的接口。 3. 创建一个工厂类(Factory),该类包含一个静态方法,根据不同的条件创建并返回不同的具体产品对象。 示例代码如下: ```java // 抽象产品类 public interface Product { void operation(); } // 具体产品类 public class ConcreteProduct implements Product { @Override public void operation() { System.out.println("This is a concrete product."); } } // 工厂类 public class Factory { public static Product createProduct(String type) { if (type.equals("A")) { return new ConcreteProductA(); } else if (type.equals("B")) { return new ConcreteProductB(); } else { return null; } } } ``` 客户端调用示例: ```java public class Client { public static void main(String[] args) { Product productA = Factory.createProduct("A"); productA.operation(); // 输出:"This is a concrete product A." Product productB = Factory.createProduct("B"); productB.operation(); // 输出:"This is a concrete product B." } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值