工厂设计模式(学设计模式第一天)

目录

什么是工厂设计模式?

正常需求遇到了什么问题?使用工厂模式能解决吗?

怎么去解决?

总结


什么是工厂设计模式?

设计模式:是在项目中,解决项目中遇到的问题,从而进行封装,整理出来的一种大部分人认可的模式。

工厂设计模式:每个项目内部,都会有很多的同一种类的产品,整体封装到工厂类中,让其他项目只需要知道工厂类,就可以拿到不同的产品。比如:一家电子厂,你无效关心它的产品是怎么生产的,你只需要知道它生产的类目,电子厂就会给你对应的产品。

正常需求遇到了什么问题?使用工厂模式能解决吗?

需求:开发一个给动物喂食后还可以让它独自去玩

分析:

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.整体项目,会多一层工厂类,会导致项目文件增加,变得复杂

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值