工厂模式---工厂方法模式

xiaoxiao2021-02-28  91

一、简单工厂 简单工厂并不是一种设计模式。更像是一种编程习惯。 需求实例:创建一个披萨订单系统,根据不同的口味创建不同的披萨。 1、定义一个披萨商店

//披萨商店 public class PizzaStore { //简单披萨工厂 SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory){ this.factory=factory; } //订单 public void orderPizza(String type){ Pizza pizza; //具体的披萨实例 pizza=factory.createPizza(type); pizza.prepare(); pizza.bake(); pizza.box(); } }

2、简单披萨工厂

//简单披萨工厂,可以申明为静态的 public class SimplePizzaFactory { //根据不同的口味创建不同的披萨实例 public Pizza createPizza(String type){ Pizza pizza=null; if(type.equals("cheese")){ pizza=new CheesePizza(); }else if(type.equals("clam")){ pizza=new ClamPizza(); } return pizza; } }

但是针对不同地区,加盟店可能需要提供不同的口味,以满足当地的习惯。因此,需要不同的披萨工厂。这就导致加盟店与披萨工厂耦合性较高。而工厂模式就是解决这种耦合性。让加盟店自己生产披萨,而不依赖工厂。

工厂方法模式 工厂方法模式定义了一个创建对象的接口(抽象类),但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类中。

所有工厂模式都用来封装对象的创建。通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。 Creator是一个抽象类,它实现了所有操纵产品的方法,但是不实现工厂方法。由他的子类实现这个抽象的factoryMethod(工厂方法)。注意,也可以定义一个默认的工厂方法来产生某些具体的产品,这样,即使创建者没有任何子类,依然可以创建产品。

ConcreteCreator是Creator的子类,它继承自抽象类,实现了抽象方法,制造具体的产品。有点类似简单工厂方法。

创建者不需要知道实际创建的产品是哪一个,选择使用哪个子类,自然就决定了实际创建的产品是什么。

1、抽象的创建者

//抽象的披萨商店 public class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza; //调用工厂方法 pizza=createPizza(type); pizza.prepare(); pizza.bake(); pizza.box(); return pizza; } //抽象工厂方法 protected abstract Pizza createPizza(String type); }

2、子类实现抽象的工厂,产生具体的披萨产品

public class NYPizzaStore extends PizzaStore { //实现抽象工厂方法 @Override protected Pizza createPizza(String type) { Pizza pizza=null; if(type.equals("cheese")){ pizza=new CheesePizza(); }else if(type.equals("clam")){ pizza=new ClamPizza(); } return pizza; } }

这里传递了一个参数type,从而创建不同的对象,但是工厂经常只产生一种对象,不需要参数化,所以也可以不传参数。

3、定义一个披萨类,所有具体的披萨都继承自该类

public class Pizza { //披萨信息 String name; String dough; void prepare(){ System.out.println("name="+name+" dough="+dough); } void bake(){ System.out.println("bake for 25 at 350"); } void box(){ System.out.println("box nowing"); } public String getName(){ return name; } }

5、定义不同地区风味的披萨

//纽约风味的pizza,继承自Pizza public class CheesePizza extends Pizza { public CheesePizza(){ name="NY style chesses pizza"; dough="thin crust dough"; } } //芝加哥风味披萨 public class ClamPizza extends Pizza{ public ClamPizza(){ name="Chicago style chesses pizza"; dough="Extra crust dough"; } }

6、实例测试

public class PizzaTest { public static void main(String[] args) { //由具体的子类来生成披萨产品 PizzaStore nystore=new NYPizzaStore(); //订购cheese风味的披萨 Pizza pizza=nystore.orderPizza("cheese"); System.out.println(pizza.getName()); } } //结果 //这是商店对披萨的处理流程 nameNY style chesses pizza dough=thin crust dough bake for 25 at 350 box nowing //返回披萨的名称 NY style chesses pizza
转载请注明原文地址: https://www.6miu.com/read-78160.html

最新回复(0)