工厂处理创建对象的细节。
(2)工厂方法:将原本由一个对象负责所有具体类的实例化,变为由一群子类负责实例化。
工厂方法(createPizza)用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
工厂方法是抽象的,是封装对象的创建,所以依赖子类来处理对象的创建。
工厂方法模式的定义:定义了一个创建对象的接口(此处的接口不仅指抽象类或者接口,还可以指一个方法,如此处就是一个抽象方法),但由子类决定决定要实例化的类是哪一个。
工厂方法让类把实例化推迟到子类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中解耦。
工厂方法和抽象工厂的区别:工厂方法潜伏在抽象工厂里面,抽象工厂的方法经常以工厂方法的方式实现的,抽象工厂的任务是定义一个负责创建一组
产品的接口。这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。
工厂方法和抽象工厂都是负责创建对象,但是工厂方法用的是继承,而抽象工厂用的是组合。
(1)简单工厂:简单工厂其实不是一个模式,比较像一种编程习惯。PizzaStore中由一个对象来负责所有具体Pizza类的实例化。
public class SimplePizzaFatory() {
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;
}
}
public class PizzaStore {
SimplePizzaFatory factory;
public PizzaStore(SimplePizzaFatory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza = factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
(2)工厂方法:将原本由一个对象负责所有具体类的实例化,变为由一群子类负责实例化。
工厂方法(createPizza)用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
工厂方法是抽象的,是封装对象的创建,所以依赖子类来处理对象的创建。
工厂方法模式的定义:定义了一个创建对象的接口(此处的接口不仅指抽象类或者接口,还可以指一个方法,如此处就是一个抽象方法),但由子类决定决定要实例化的类是哪一个。
工厂方法让类把实例化推迟到子类。
abstract Product factoryMethod(String type);
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
public abstract Pizza createPizza(String type);
}
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中解耦。
工厂方法和抽象工厂的区别:工厂方法潜伏在抽象工厂里面,抽象工厂的方法经常以工厂方法的方式实现的,抽象工厂的任务是定义一个负责创建一组
产品的接口。这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。
工厂方法和抽象工厂都是负责创建对象,但是工厂方法用的是继承,而抽象工厂用的是组合。
//Pizza原料工厂接口
public interface PizzaIngredientFactory {
public Dough createDough();
public Sauce createSauce();
public Clam createClam();
}
//纽约原料工厂
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
public Dough createDough() {
return new ThinCrustDough();
}
public Sauce createSauce() {
return new MarinaraSauce();
}
public Clam createClam() {
return new FreshClams();
}
}
//实现芝加哥原料工厂不同之处:生产蛤蜊纽约使用新鲜的蛤蜊FreshClams,而芝加哥工厂不靠海就使用冷冻蛤蜊
//Pizza抽象类
public abstract class Pizza {
Dough dough;
Sauce sauce;
Clam clam;
abstract void prepare();
void bake() {
// do something.
}
void cut() {
// do something.
}
void box() {
// do something.
}
}
//CheesePizza:让原料工厂去处理区域差异(纽约或者加州的CheesePizza原料Dough和Sauce不一样)
public class CheesePizza extends Pizza {
PizzaIngredientFactory factory;
public CheesePizza(PizzaIngredientFactory factory) {
this.factory = factory;
}
public void prepare() {
dough = factory.createDough();
sauce = factory.createSauce();
// clam 不需要用到
}
}
//ClamPizza:蛤蜊披萨
public class ClamPizza extends Pizza {
PizzaIngredientFactory factory;
public ClamPizza(PizzaIngredientFactory factory) {
this.factory = factory;
}
public void prepare() {
dough = factory.createDough();
sauce = factory.createSauce();
clam = factory.createClam(); //和其他披萨的不同之处,不同原料工厂生产的蛤蜊也不同
}
}
//NYPizzaStore
public class NYPizzaStore extends Pizza {
public Pizza createPizza(String type) {
Pizza pizza = null;
PizzaIngredientFactory factory = new NYPizzaIngredientFactory();
if(type.equals("cheese")) {
pizza = new CheesePizza(factory);
} else if (type.equals("clam")) {
pizza = new ClamPizza(factory);
}
return pizza;
}
}