Head First---工厂模式

工厂处理创建对象的细节。

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

//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;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值