Head First 设计模式之工厂模式(Java例子)

前言:

来源于《head first 设计模式》。当作读书笔记了,这次看的是第四章装工厂模式。其实这一章前几天就看完了,拖延癌晚期,没整理,今天就来填一下坑吧。

抽象工厂模式的概念

提供一个接口用于创建相关或者依赖对象的家族,并不需要明确指定具体类

工厂方法模式的概念

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类

注意:上述所写的接口并不是java中的接口,可以是抽象类也可以是java中的接口噢,大家别误解了。
在正式进入上述两个模式学习之前,我们先来了解一下简单工厂。
简单工厂不是一个设计模式,仅仅是一种变成习惯而已,那么什么是简单工厂模式呢?来看例子:
假设你有一个披萨店,那么一开始你可能会这样子写:

public class PizzaStore {
     public Pizza orderPizza(String type) {
     	Pizza pizza=new Pizza();
     	if(type.equals("cheeese")){
     		pizza=new CheesePizza();
     	}else if(type.equals("greek")){
     		pizza=new GreekPizza();
     	}
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

但是如果我们需要更多的类型的披萨呢??我们就需要修改该代码不断的加入if else语句了。 此时的我们可以发现代码后期会修改的部分就是披萨的类型,这时候该是时候使用封装了

  • 定义一个简单的工厂
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;
	}
}
  • 修改披萨店的代码
public class PizzaStore {
	 SimplePizzaFactory factory;
     public Pizza orderPizza(String type) {
     	Pizza pizza;
     	pizza=factory.createPizza(type);
     	pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
}

这样就完成了一个简单工厂,披萨简单工厂负责处理pizza生成的细节。披萨店铺负责处理披萨打包切割准备的细节。这样可以如果需要修改pizza的种类,则无需去披萨店铺类中修改,只需对对症下药去工厂处修改即可。简单工厂用法在于将功能分化,利于后期的版本迭代。
热身完毕!进入工厂方法模式以及抽象工厂方法模式的学习把!

工厂方法模式

还是披萨店=。=,现在有两个分店噢,一个纽约披萨店,一个芝加哥披萨店,如果再用简单工厂方法,就需要在简单工厂里面再做修改=。=,不能让每个地区的门店自由修改他们的风味。
这时候工厂方法登场啦

  • 声明一个工厂方法
public abstract class PizzaStore {
	public Pizza orderPizza(String type) {
		Pizza pizza;
 		createPizza(type);
 		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}
	protected abstract Pizza createPizza(String type);
}
  • 创建地区分店

public class NYPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
		if (item.equals("cheese")) {
			return new NYStyleCheesePizza();
		} else if (item.equals("veggie")) {
			return new NYStyleVeggiePizza();
		} else if (item.equals("clam")) {
			return new NYStyleClamPizza();
		} else if (item.equals("pepperoni")) {
			return new NYStylePepperoniPizza();
		} else return null;
	}
}

调用代码

public static void main(String[] args) {
		PizzaStore nyStore = new NYPizzaStore();
		//PizzaStore chicagoStore = new ChicagoPizzaStore();
 
		Pizza pizza = nyStore.orderPizza("cheese");
		System.out.println("Ethan ordered a " + pizza.getName() + "\n");

看一下uml图
在这里插入图片描述
这就是工厂模式的体现:让子类决定要实例的类是哪一个?即生产出怎么样的产品。即让地方披萨店自己做主,来实现披萨的生成。
接下来贴出真正的工厂模式的uml图。
在这里插入图片描述
对比我们的披萨店uml图其实就是多了点产品的uml图而已,基本都是一样,加了一条具体工厂依赖与具体的产品。总结就是工厂方法模式将具体的实现放在子类之中,仅仅提供一个抽象方法规范。

抽象工厂方法模式

老披萨店了,,,,这次加入了原料的问题,不同的地域需要使用不同的原料
如果理解了上门工厂方法再来理解这个应该不难。
直接给出抽象方法模式的uml图,。
在这里插入图片描述
这里偷懒啦。其实抽象工厂模式就是提供一个接口,用于创建相关的一组相关产品,其实抽象工厂的方法经常以工厂方法来进行实现,抽象工厂的任务就是定义一个负责创造一组产品的接口,这个接口里的每个方法都负责创造一个具体产品,我们利用实现抽象工厂的子类来提供这些具体的做法,所以在抽象工厂中利用工厂方法实现生成方法是自然的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值