工厂模式---工厂方法模式
2017-05-07 19:15
204 查看
一、简单工厂
简单工厂并不是一种设计模式。更像是一种编程习惯。
需求实例:创建一个披萨订单系统,根据不同的口味创建不同的披萨。
1、定义一个披萨商店
2、简单披萨工厂
但是针对不同地区,加盟店可能需要提供不同的口味,以满足当地的习惯。因此,需要不同的披萨工厂。这就导致加盟店与披萨工厂耦合性较高。而工厂模式就是解决这种耦合性。让加盟店自己生产披萨,而不依赖工厂。
工厂方法模式
工厂方法模式定义了一个创建对象的接口(抽象类),但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类中。
所有工厂模式都用来封装对象的创建。通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。
Creator是一个抽象类,它实现了所有操纵产品的方法,但是不实现工厂方法。由他的子类实现这个抽象的factoryMethod(工厂方法)。注意,也可以定义一个默认的工厂方法来产生某些具体的产品,这样,即使创建者没有任何子类,依然可以创建产品。
ConcreteCreator是Creator的子类,它继承自抽象类,实现了抽象方法,制造具体的产品。有点类似简单工厂方法。
创建者不需要知道实际创建的产品是哪一个,选择使用哪个子类,自然就决定了实际创建的产品是什么。
1、抽象的创建者
2、子类实现抽象的工厂,产生具体的披萨产品
这里传递了一个参数type,从而创建不同的对象,但是工厂经常只产生一种对象,不需要参数化,所以也可以不传参数。
3、定义一个披萨类,所有具体的披萨都继承自该类
5、定义不同地区风味的披萨
6、实例测试
简单工厂并不是一种设计模式。更像是一种编程习惯。
需求实例:创建一个披萨订单系统,根据不同的口味创建不同的披萨。
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
相关文章推荐
- Java-设计模式-工厂模式浅谈(二)-工厂方法模式
- 【设计模式】工厂模式(静态工厂模式、工厂方法模式、抽象工厂模式)
- 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 工厂模式(静态工厂模式、工厂方法模式、抽象工厂模式)
- 工厂模式之工厂方法模式
- 工厂模式(工厂方法模式,抽象工厂模式) Java
- 工厂模式、工厂方法模式和抽象工厂模式
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 简单工厂模式、工厂方法模式、反射工厂模式、抽象工厂模式
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 工厂模式(二)--工厂方法模式
- 工厂模式三部曲-工厂方法模式
- java设计模式-工厂模式(简单工厂模式和工厂方法模式)
- 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
- 工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
- 工厂模式(二)-工厂方法模式(C++实现)
- 工厂模式三部曲:工厂方法模式
- 工厂模式-工厂方法模式
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 工厂模式我之见(简单工厂模式 VS 工厂方法模式)(转载)