思想
工厂方法模式(factory method pattern)定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,让类的实例化推迟到子类。
从类图可以看出,工厂方法模式封装了具体类型的实例化,抽象的Creator类提供了一个抽象方法用来创建产品,同时也实现了一些操作产品的方法(如anOperation),这些方法不需要涉及ConcreteProduct,而是通过Product接口。所以,工厂方法模式帮助我们把产品的创建(子类实现的factoryMethod方法)与使用(Creator中anOperation等方法)解耦。
抽象工厂模式(abstract factory pattern)提供了一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
从类图可以看出,抽象工厂模式允许客户(Client)使用抽象的接口(AbstractFactory)来创建一组相关的产品,而不需要关心实际产出的创建细节。这样一来,客户就从具体的产品创建中被解耦。
代码
Pizza.Java
package pizza; import java.util.ArrayList; public abstract class Pizza { //创建pizza类 String name; String dough; String sauce; ArrayList toppings = new ArrayList(); public void prepare(){ System.out.println("Preparing " + name ); for(int i = 0;ii){ System.out.println(" "+toppings.get(i)); } } public String getName() { return name; } }
NYStyleCheesePizza.Java
package pizza; import java.util.jar.Attributes.Name; public class NYStyleCheesePizza extends Pizza{ //pizza具体子类 public NYStyleCheesePizza() { // TODO Auto-generated constructor stub name = "Ny style"; toppings.add("Cheese lalalal"); } }
PizzaStore.Java
package pizzastoree; import pizza.Pizza; public abstract class PizzaStore { public Pizza orderPizza(String type){ Pizza pizza; pizza = createPizza(type); //创建对象,对象的创建步奏延迟到主类中 pizza.prepare(); return pizza; } abstract Pizza createPizza(String type); }
NYPizzaStore.Java
package pizzastoree; import pizza.NYStyleCheesePizza; import pizza.Pizza; public class NYpizzaStore extends PizzaStore{ @Override Pizza createPizza(String item) { // TODO Auto-generated method stub if(item.equals("cheese")){ return new NYStyleCheesePizza(); }else return null; } }
Test.Java
package test; import pizza.Pizza; import pizzastoree.NYpizzaStore; import pizzastoree.PizzaStore; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub PizzaStore nyStore = new NYpizzaStore(); Pizza pizza = nyStore.orderPizza("cheese"); System.out.println(pizza.getName()); } }
结果
总结
1.所有的工厂都是用来封装对象创建的
2.简单工厂虽然不是真正的设计模式,但是是一个简单而且常用的方法,可以将客户程序从具体类解耦
3.工厂方法使用继承,把对象的创建延时到子类
4.抽象工厂使用对象组合,对象的创建被实现在工厂接口的方法中
工厂模式有什么用:
系统可以在不修改具体工厂角色的情况下引进新的产品
客户端不必关心对象如何创建,明确了职责
更好的理解面向对象的原则:面向接口编程,而不要面向实现编程
工厂模式适用场景:
一个系统应当不依赖于产品类实例被创建,组成和表示的细节。这对于所有形态的工厂模式都是重要的
该系统的产品要有至少一个的产品族
工厂模式的约束:同属于同一个产品族的产品是设计成在一起使用的
不同的产品以一系列的接口的面貌出现,从而使得系统不依赖于接口实现的细节