【设计模式】学习笔记4:简单工厂模式(Simple Factory)



本文出自   http://blog.youkuaiyun.com/shuangde800



之前已经学过“针对接口编程,而不是针对实现编程”,但是,当使用“new”时,却的确是在实例化一个具体类,所以用的是具体实现,而不是接口。

Duck duck = new MallardDuck( );

上面就是常用的实例化的new 方法。


用"new"有什么不好呢? 

在技术上,new 没错,都是“改变”的错。

针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。因为如果是针对接口而写,那么通过多态,它可以与任何新类实现该接口。

但是,使用大量的具体类时,也是自找麻烦,因为一旦加入新的具体类,就必须改变代码。也就是说,你的代码并非“对修改关闭”。相用新的类必须重新打开它。



认识简单工厂模式

假设要开一个比萨店,要获取很多不同类型的比萨,那么我们可以写这样一个方法来获取比萨对象:

Pizza orderPizza(String type){
    Pizza pizza;

    if(type.equals("chees")){
        pizza = new CheesePizza();
    }else if(type.equals("greek")){
        pizza = new GreekPizza(); 
    }else if(type.equals("pepperoni")){
        pizza = new PepperoniPizza();
    }

    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();

    return pizza;
}



当比萨类型改变,或删除时,上面的代码就要改变,不符合设计原则。


所以我们把创建对象移到orderPizza()之外,由这个对象专职创建比萨。


SimplePizzaFactory只做一件事情:帮它的客户创建比萨。 

public class SimplePizzaFactory {

	public Pizza createPizza(String type) {
		Pizza pizza = null;

		if (type.equals("cheese")) {
			pizza = new CheesePizza();
		} else if (type.equals("pepperoni")) {
			pizza = new PepperoniPizza();
		} else if (type.equals("clam")) {
			pizza = new ClamPizza();
		} else if (type.equals("veggie")) {
			pizza = new VeggiePizza();
		}
		return pizza;
	}
}


上面对象就是工厂(factory),工厂处理创建对象的细节。



下面重做比萨店:


PizzaStore类,使用SimplePizzaFactory对象来创建比萨 

public class PizzaStore {
	SimplePizzaFactory factory;
 
	public PizzaStore(SimplePizzaFactory factory) { 
		this.factory = factory;
	}
 
	public Pizza orderPizza(String type) {
		Pizza pizza;
 
		pizza = factory.createPizza(type);  //注意,把new变成了工厂的创建方法!不再使用具体实例化!
 
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();

		return pizza;
	}

}






定义简单工厂模式

简单工厂其实不是一个设计模式,反而是一种编程习惯,但是却经常使用。

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值