Java设计模式(十)—— 工厂模式2

文章介绍了如何在披萨订购系统中使用简单工厂模式和工厂方法模式。简单工厂模式适用于创建对象种类较少的情况,而工厂方法模式则提供了更好的扩展性,允许在子类中定义具体的产品创建。文中通过披萨种类的不同,展示了这两种模式的实现细节,包括代码示例和应用场景,强调了面向对象设计原则在实际项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

披萨订购—简单工厂模式
披萨订购—工厂方法模式



前言

Hello,小伙伴们,欢迎来到柚子的博客~让我们一起成长吧o( ̄▽ ̄)ブ


提示:以下是本篇文章正文内容,下面案例可供参考

一、简单工厂模式

1.简单工厂模式基本介绍

(1)简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 简单工厂模式是工厂模式家族中最简单实用的模式。
(2)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。
(3)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

2.简单工厂模式实现

(1)简单工厂模式的设计方案:定义一个可以实例化Pizza对象的类,封装创建对象的代码。
(2)代码实现:
在这里插入图片描述
(3)创建一个简单工厂类:

//简单工厂类
public class SimpleFactory {
	//根据orderType,返回对应的Pizza对象
	public Pizza createPizza(String orderType) {
		Pizza pizza = null;
		System.out.println("使用简单工厂模式~~");
		if(orderType.equals("cheese")) {
			pizza = new CheesePizza();
			pizza.setName("奶酪披萨");
		} else if (orderType.equals("greek")) {
			pizza = new GreekPizza();
			pizza.setName("希腊披萨");
		} else if (orderType.equals("pepper")) {
			pizza = new PepperPizza();
			pizza.setName("胡椒披萨");
		}
		return pizza;
	}
}

(4)制定一个订购披萨类:

//修改OrderPizza, 使用简单工厂模式来创建对象,更加的方便灵活
public class OrderPizza {
	//定义一个简单工厂对象
	SimpleFactory simpleFactory;
	Pizza pizza = null;
	//构造器
	public OrderPizza(SimpleFactory simpleFactory) {
		setFactory(simpleFactory);
	}
	public void setFactory(SimpleFactory simpleFactory) {
		String orderType = getType();//用户输入的
		this.simpleFactory = simpleFactory;//设置简单工厂对象
		do {
			orderType = getType();
			pizza = this.simpleFactory.createPizza(orderType);
			//输出pizza
			if (pizza != null) {//订购成功
				pizza.prepare();
				pizza.bake();
				pizza.cut();
				pizza.box();
			} else {
				System.out.println("订购披萨失败");
				break;
			}
		} while(true);
	}
	//写一个方法,可以获取客户希望订购的披萨种类
	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader.class);
			System.out.println("input pizza 种类:");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}
}

(5)创建披萨订购运行类:

//相当于一个客户端,发出订购
public class PizzaStore {
	public static void main(String[] args) {
		//使用简单工厂模式
		new OrderPizza(new SimpleFactory());
		System.out.println("退出程序~~");
	}
}

(6)简单工厂模式的补充,使用静态方式:

//简单工厂类
public class SimpleFactory {
	//简单工厂模式 也叫 静态工厂模式
	public static Pizza createPizza2(String orderType) {
		Pizza pizza = null;
		System.out .println("使用简单工厂模式2");
		if(orderType.equals("cheese")) {
			pizza = new CheesePizza();
			pizza.setName("奶酪披萨");
		} else if (orderType.equals("greek")) {
			pizza = new GreekPizza();
			pizza.setName("希腊披萨");
		} else if (orderType.equals("pepper")) {
			pizza = new PepperPizza();
			pizza.setName("胡椒披萨");
		}
		return pizza;
	}
}	
//修改OrderPizza, 使用简单工厂模式来创建对象,更加的方便灵活
public class OrderPizza2 {
	Pizza pizza = "";
	String orderType = "";
	//构造器
	public OrderPizza2() {
		do {
			orderType = getType();
			pizza = SimpleFactory.createPizza2(orderType);
			//输出pizza
			if(pizza != null) { //订购成功
				pizza.prepare();
				pizza.bake();
				pizza.cut();
				pizza.box();
			} else {
				System.out.println("订购披萨失败");
				break;
			}
		} while (true);
	}
	//写一个方法,可以获取客户希望订购的披萨种类
	private String getType() {
		try {
			BufferedReader strin = new BufferedReader(new InputStreamReader.class);
			System.out.println("input pizza 种类:");
			String str = strin.readLine();
			return str;
		} catch (IOException e) {
			e.printStackTrace();
			return "";
		}
	}
}
//相当于一个客户端,发出订购
public class PizzaStore {
	public static void main(String[] args) {
		//使用静态工厂模式
		new OrderPizza2();
		System.out.println("退出程序~~");
	}
}

二、工厂方法模式

1.披萨订购的新需求

(1)披萨项目的新需求:客户在点披萨时,可以点不同口味的披萨,比如北京的奶酪pizza、北京的胡椒pizza 或者 是伦敦的奶酪pizza、伦敦的胡椒pizza。
(2)新需求的思路:
思路1:使用简单工厂模式,创建不同的简单工厂类,比如BJPizzaSimpleFactory、LDPizzaSimpleFactory 等等。从当前这个案例来说,也是可以的,但是考虑到项目的规模,以及软件的可维护性、可扩展性并不是特别好。
思路2:使用工厂方法模式 。

2.工厂方法模式介绍

(1)工厂方法模式设计方案:将披萨项目的实例化功能抽象成抽象方法,在不同的口味点餐子类中具体实现。
(2)工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类
在这里插入图片描述

3.工厂方法模式实现

代码如下(示例):
(1)创建一个披萨抽象类:

public abstract class Pizza {
	//披萨名字
	protected String name;
	//准备原材料,不同的披萨不一样,因此,我们做成抽象方法
	public abstract void prepare();
	//烘烤
	public void bake() {
		System.out.println(name + " baking;");
	}
	//切块
	public void cut() {
		System.out.println(name + " cuting;");
	}
	//打包
	public void box() {
		System.out.println(name + " boxing;");
	}
	public void setName(String name) {
		this.name = name;
	}
}

(2)创建四个继承pizza类的具体pizza:

public class BJCheesePizza extends Pizza {
	@Override
	public void prepare() {
		setName("北京的奶酪pizza");
		System.out.println("北京的奶酪pizza 准备原材料");
	}
}
public class BJPepperPizza extends Pizza {
	@Override
	public void prepare() {
		setName("北京的胡椒pizza");
		System.out.println("北京的胡椒pizza 准备原材料");
	}
}
public class LDCheesePizza extends Pizza {
	@Override
	public void prepare() {
		setName("伦敦的奶酪pizza");
		System.out.println("伦敦的奶酪pizza 准备原材料");
	}
}
public class LDPepperPizza extends Pizza {
	@Override
	public void prepare() {
		setName("伦敦的胡椒pizza");
		System.out.println("伦敦的胡椒pizza 准备原材料");
	}
}

(3)创建一个抽象的订购pizza类:

public abstract class OrderPizza {
	//定义一个抽象方法,createPizza,让各个工厂子类自己实现 
	abstract Pizza createPizza(String orderType);
	//构造器
	public OrderPizza() {
		Pizza pizza = null;
		String orderType; //订购披萨的类型
		do {
			orderType = getType();
			pizza = createPizza(orderType);//抽象方法,由工厂子类完成
			//输出pizza 制作过程
			pizza.prepare();
			pizza.bake();
			pizza.cut();
			pizza.box();
		} while (true);
	}
}

(4)创建两个继承订购pizza类的具体OrderPizza类:

public class BJOrderPizza extends OrderPizza {
	@Override
	Pizza createPizza(String orderType) {
		Pizza pizza = null;
		if(orderType.equals("cheese")) {
			pizza = new BJCheesePizza(); 
		} else if (orderType.equals("pepper")) {
			pizza = new BJPepperPizza();
		}
		return pizza;
	}
}
public class LDOrderPizza extends OrderPizza {
	@Override
	Pizza createPizza(String orderType) {
		Pizza pizza = null;
		if(orderType.equals("cheese")) {
			pizza = new LDCheesePizza(); 
		} else if (orderType.equals("pepper")) {
			pizza = new LDPepperPizza();
		}
		return pizza;
	}
}

(4)创建一个披萨订购运行类:

public class PizzaStore {
	public static void main(String[] args) {
		String loc = "bj";
		if (loc.equals("bj")) {
			//创建北京口味的各种pizza
			new BJOrderPizza();
		} else {
			//创建伦敦口味的各种pizza
			new LDOrderPizza();
		}
	}
}

总结

披萨订购—简单工厂模式
披萨订购—工厂方法模式


╭◜◝ ͡ ◜◝╮
( ˃̶͈◡˂ ̶͈ )感觉有用的话,欢迎点赞评论呀!
╰◟◞ ͜ ◟◞╯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子猫屿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值