Head First---工厂模式

来源:互联网 发布:python写的大型游戏 编辑:程序博客网 时间:2024/05/16 00:45
工厂处理创建对象的细节。

(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);}


(3)抽象工厂模式:提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。
抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中解耦。
工厂方法和抽象工厂的区别:工厂方法潜伏在抽象工厂里面,抽象工厂的方法经常以工厂方法的方式实现的,抽象工厂的任务是定义一个负责创建一组
产品的接口。这个接口内的每个方法都负责创建一个具体产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。
工厂方法和抽象工厂都是负责创建对象,但是工厂方法用的是继承,而抽象工厂用的是组合。

//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(); //和其他披萨的不同之处,不同原料工厂生产的蛤蜊也不同}}//NYPizzaStorepublic 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;}}




0 0