工厂模式(二)

一个重要的提醒:在设计模式中,所谓的“实现一个接口”并“不一定”表示“写一个类”并用implement关键词来实现某个Java接口。“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”。

书中例子继续~~~

书中要开加盟店,并且Pizza要加入当地的风味,但是仍然要沿用主店的做法手艺(即沿用主类不变的东西,扩展可变的东西)

再来回顾上一篇代码:

package com.zl.factory.one;

public class PizzaStore {

	SimplePizzaFactory factory;
	public PizzaStore(SimplePizzaFactory factory){
		this.factory=factory;
	}
	
	public Pizza orderPizza(String type){
		Pizza pizza;
		pizza=factory.createPizza(type);
		
		pizza.prepare();//不变
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
		
	}
}

由于加盟店和主店就Pizza种类不同,所以将上面的主类修改成一个超类,被其他的加盟店进行继承。而又因为每个加盟店制造Pizza的风味各不同,所以将createPizza()方法进行抽象,即为工厂方法。

public abstract class PizzaStore {

	public Pizza OrderPizza(String type){
		Pizza pizza;
		pizza=createPizza(type);
		
		pizza.prepare();
		pizza.bake();
		pizza.cut();
		pizza.box();
		return pizza;
	}

	protected abstract Pizza createPizza(String type);
}
public class NYStorePizzStore extends PizzaStore {

	@Override
	protected Pizza createPizza(String type) {
		Pizza pizza;
		if(type.equals("cheese")){
			pizza =new NYStyleCheesePizza();
		}else if(type.equals("greek")){
			pizza =new NYStyleGreekPizza();
		}else if(type.equals("pepper")){
			pizza =new NYStylePepperoniPizza();
		}
		return pizza;
	}

}

声明一个工厂方法:

工厂方法用来处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。

abstract  Product factoryMethod(String type)

1.工厂方法是抽象的,所以依赖子类来处理对象的创建。

2.工厂方法必须返回一个产品。超类中定义的方法,通常使用到工厂方法的返回值。

3.工厂方法将客户(也就是超类中的代码)和实际创建具体产品的代码分隔开来。

4.工厂方法可能需要参数,也可能不用参数。

Pizza类:

package com.zl.factory.two;

 public abstract class Pizza {
	String name;
	String dough;
	String sauce;

	public void prepare(){
		System.out.println("prepare");
	}
	public void bake(){
		System.out.println("bake");
	}
	public void cut(){
		System.out.println("cut");
	}
	public void box(){
		System.out.println("box");
	}
 
	public String getName(){
		return name;
	}
}
package com.zl.factory.two;

public class NYStyleCheesePizza extends Pizza {

	public NYStyleCheesePizza(){
		name="NYStyleCheesePizza name";
		dough="NYStyleCheesePizza dough";
		sauce="NYStyleCheesePizza sauce";
	}
}

测试吃pizza类:

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		PizzaStore nyStore=new NYStorePizzStore();
		Pizza pizza=nyStore.OrderPizza("cheese");
		System.out.print(pizza.name);
		System.out.print(pizza.dough);
		System.out.print(pizza.sauce);
	}


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


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值