目录
什么是工厂设计模式?
设计模式:是在项目中,解决项目中遇到的问题,从而进行封装,整理出来的一种大部分人认可的模式。
工厂设计模式:每个项目内部,都会有很多的同一种类的产品,整体封装到工厂类中,让其他项目只需要知道工厂类,就可以拿到不同的产品。比如:一家电子厂,你无效关心它的产品是怎么生产的,你只需要知道它生产的类目,电子厂就会给你对应的产品。
正常需求遇到了什么问题?使用工厂模式能解决吗?
需求:开发一个给动物喂食后还可以让它独自去玩
分析:
1.给猫、狗、老虎等喂食
2.让猫、狗、老虎独自去玩
结论:使用java的多态,实现,定义动物的一个接口,然后猫、狗、老虎都实现动物接口
//动物
public interface Pet {
//吃
void eat();
//玩
void play();
}
public class Cat implements Pet{
@Override
public void eat() {
System.out.println("小猫开始吃");
}
@Override
public void play() {
System.out.println("小猫开始抓鱼");
}
}
public class Dog implements Pet{
@Override
public void eat() {
System.out.println("小狗开始吃");
}
@Override
public void play() {
System.out.println("小狗开始追球");
}
}
public class Tiger implements Pet{
@Override
public void eat() {
System.out.println("大老虎开始吃");
}
@Override
public void play() {
System.out.println("大老虎开始查看领地");
}
}
测试:
public class FactoryPatternTest {
public static void main(String[] args) {
Pet cat = new Cat();
cat.eat();
cat.play();
Pet dog = new Dog();
dog.eat();
dog.play();
}
}
输出:
小猫开始吃
小猫开始抓鱼
小狗开始吃
小狗开始追球
发现问题:
1.使用者需要知道Pet接口和Dog、Cat、Tiger类,如果实现类有50个,共计需要知道50个类1个接口
2.当Dog、Cat、Tiger的创建方式发生变更时,或者类名变更时,需要修改项目中所有new Dog()的地方
3.进行调用,2种动物的测试就6行了,如果50种,你需要一直写重复代码
怎么去解决?
使用一个类,封装所有Dog、Cat、Tiger的实现类变成只需要知道Pet接口和封装对象
//封装对象
public class PetFactoryPattern {
public static Pet createPet(String name) {
if("cat".equals(name)) {
return new Cat();
}else if ("dog".equals(name)) {
return new Dog();
}else if ("tiger".equals(name)) {
return new Tiger();
}
return null;
}
}
测试:
public class FactoryPatternTest {
public static void main(String[] args) {
// Pet cat = new Cat();
// cat.eat();
// cat.play();
//
// Pet dog = new Dog();
// dog.eat();
// dog.play();
Pet cat = PetFactoryPattern.createPet("cat");
cat.eat();
cat.play();
Pet dog = PetFactoryPattern.createPet("dog");
dog.eat();
dog.play();
Pet tiger = PetFactoryPattern.createPet("tiger");
tiger.eat();
tiger.play();
}
}
输出:
小猫开始吃
小猫开始抓鱼
小狗开始吃
小狗开始追球
大老虎开始吃
大老虎开始查看领地
解决总结:
问题 | 解决 | 解决方式 | 带来的新问题 |
使用者需要知道Pet接口和Dog、Cat、Tiger类,如果实现类有50个,共计需要知道50个类1个接口 | 是 | 把new Cat()封装到PetFactoryPattern工厂中,只需要关心Pet接口和PetFactoryPattern工厂(封装) | 需要知道name,才能通过PetFactoryPattern.createPet("cat")创建 |
当Dog、Cat、Tiger的创建方式发生变更时,或者类名变更时,需要修改项目中所有new Dog()的地方 | 是 | 不关心怎么创建的,只需要修改PetFactoryPattern工厂的new Dog()就可以(解耦) | 项目整体中,每一产品类接口,都会多一个工厂类,项目文件增加,变得复杂 |
进行调用,2种动物的6行了,如果50种,你需要一直写重复代码 | 否 |
总结
工厂模式优势:
1.封装了实现类,无需关心接口的实现类,只需要知道工厂类,前期定好名称就可以了
2.解耦了实际业务中直接使用实现类,由工厂类代替具体的实现,达到实现类的新增和修改时,改动最小
工厂模式劣势:
1.需要知道name,在新增实现类时,需要新增name,给业务使用
2.整体项目,会多一层工厂类,会导致项目文件增加,变得复杂