设计模式之工厂方法模式

概要

工厂方法模式在设计模式属于创建型设计模式,实现方法是在父类中提供一个创建对象的方式,由子类来决定实例化对象的类型,这种设计模式也是Java开发中最常⻅的⼀种模式。

代码展示

/**
* 需求: 传入动物类型、人、食物参数,根据动物类型执行动物的吃饭逻辑
**/
// 不使用设计模式来实现
public class AnimalEat {
	public void eatFood(Integer animalType,Person person,Food food) {
		if(animalType == 1){
			Dog dog = new Dog();
			// 如果狗狗饿了 会吃你给的食物
			if(dog.isHunger()) {
				dog.eat(food);
			}else {
				dog.leave();
			}
		}else if(animalType == 2){
			Cat cat = new Cat();
			// 如果猫猫认识你、认为你给的食物好吃 才会吃你给的食物 
			if(cat.know(person) && cat.isLikeFood(food)) {
				cat.eat(food);
			}else {
				cat.leave();
			}
		}else {
			throw new RuntimeException("不存在的动物类型");
		}
	}
} 
// 使用设计模式
// 父类
public interface IEat {
	void eat(Person person,Food food);
}
// 两个实现子类
public class DogEatService implements IEat {
	private Dog dog = new Dog();
	public void eat(Person person,Food food) {
		// 如果狗狗饿了 会吃你给的食物
		if(dog.isHunger()) {
			dog.eat(food);
		}else {
			dog.leave();
		}
	}
}
public class CatEatService implements IEat {
	private Cat cat = new Cat();
	public void eat(Person person,Food food) {
		// 如果猫猫认识你、认为你给的食物好吃 才会吃你给的食物 
		if(cat.know(person) && cat.isLikeFood(food)) {
			cat.eat(food);
		}else {
			cat.leave();
		}
	}
}
// 子类工厂
public class EatFactory {
 	public IEat getEatService(Integer animalType) {
 		if (null == animalType) return null;
 		if (1 == animalType) return new DogEatService();
 		if (2 == animalType) return new CatEatService();
 		throw new RuntimeException("不存在的动物类型");
 	}
}
public class AnimalEat {
	public void eatFood(Integer animalType,Person person,Food food) {
		EatFactory eatFactory = new EatFactory();
		IEat animalEat = eatFactory.getEatService(animalType);
		animalEat.eat(person,food);
	}
} 

代码梳理

1、我们首先定义了一个通用父类接口IEat(因为动物肯定都需要吃东西,但是吃的东西和吃东西的方式肯定是有所差异),表示如果子类想要吃东西,就需要实现我们的方法。
2、我们定义了两个子类,一个狗狗吃东西的具体实现,一个猫猫吃东西的具体实现(吃饭逻辑只为示例,不对的地方望谅解)。狗狗我们定义为在饥饿时看到食物就会吃、猫猫则是先要判断是否为熟人、是否自己喜欢吃才会进食。
3、我们定义了吃饭工厂,以后只要是需要用到狗狗或猫猫吃饭,只需要传入相应的动物类型即可。我们就会返回能调用该类型正确吃饭逻辑函数的对象。而且以后如果有更多的动物需要实现吃饭逻辑,新建类型并修改子类工厂方法即可。

优缺点分析

根据上述的简单逻辑,大家也能看出工厂方法模式的优点;避免了创建者和具体的产品逻辑耦合、满足单一职责原则、每一个业务逻辑都在所属的自己的类中完成、满足开闭原则、无需更改调用方就可在程序中引入新的产品类型。缺点是新建的类特别多(有点像遇事不决再抽一层,哈哈)。

小结

工厂方法模式的主要意图是定义⼀个创建对象的接⼝,让其⼦类⾃⼰决定实例化哪⼀个⼯⼚类,⼯⼚模式使其创建过程延迟到⼦类进⾏。简单说就是为了提供代码结构的扩展性,屏蔽每⼀个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调⽤即可,同时,这也是去掉众多ifelse的⽅式。当然这可能也有⼀些缺点,⽐如需要实现的类⾮常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使⽤中,逐步降低。
人话: 将公共的补抽抽取出来,比如有猫、狗、猪三种动物,有三种不同的吃饭方式。你需要提供抽象类或者接口名为 动物,内部定义抽象方法为吃饭,让他们各自实现即可,下次调用直接通过抽象类或者接口直接调用抽象方法,即可访问他们对应的吃饭动作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值