概要
工厂方法模式在设计模式属于创建型设计模式,实现方法是在父类中提供一个创建对象的方式,由子类来决定实例化对象的类型,这种设计模式也是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的⽅式。当然这可能也有⼀些缺点,⽐如需要实现的类⾮常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使⽤中,逐步降低。
人话: 将公共的补抽抽取出来,比如有猫、狗、猪三种动物,有三种不同的吃饭方式。你需要提供抽象类或者接口名为 动物,内部定义抽象方法为吃饭,让他们各自实现即可,下次调用直接通过抽象类或者接口直接调用抽象方法,即可访问他们对应的吃饭动作。