Java设计模式之工厂方法模式

1.简单工厂模式

        在谈到java的工厂方法模式之前,首先来谈一谈简单工厂模式。那么什么是简单工厂模式呢?我们都知道,在现实生活当中,工厂是负责生产商品的,自然在java的设计模式之中,工厂也是负责生产商品的,不过与之不同的是,此时的商品指的是java类。在编程中,当使用new关键字创建一个类的对象时,此时该类依赖于该对象,自然他们之间的耦合度比较高,当需求变化时,我们不得不去修改此时的类的源码,很显然在某些情况下这需要非常大的工作量,此时我们就需要在起初类的设计时,对其进行封装,把那些需要改变的类封装起来,这一种思路就是简单工厂的实现方式。

        从设计模式的类型上来说,简单工厂模式属于创建型模式,但并不属于java常见的23中设计模式的一种,之所以讲它,是因为它是工厂模式家族中最简单实用的一种模式,是工厂方法模式和抽象工厂模式的基础和初步实现。下面是简单工厂模式的uml类图。


简单工厂:SimpleProductFactory

简单工厂是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,具体构造细节实在一个个if/else分支,或是在switch/case分支中实现的。

抽象产品:Product

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所有的公共接口

具体产品:objectclass

实现抽象产品,可以说是一些具体的产品

接下来通过实际的代码来解释这种设计模式:

假设一个淡水鱼养殖场可以生产很多的淡水鱼,比如草鱼,鲤鱼等,只要告诉老板淡水鱼的类型,就会给你生产出对应的鱼来,自然我们可以从中看出,这个养殖场就是一个简单的工厂,而这些鱼则是一个个具体的产品,具体代码如下:

//抽象产品类
interface FreshWaterFish{
	void grow();   //鱼在长大
	void harvset();   //鱼可以被收获了
}

//具体产品类
class Grasscarp implements FreshWaterFish{

	@Override
	public void grow() {
		System.out.println("草鱼正在生长!");
	}

	@Override
	public void harvset() {
		System.out.println("草鱼可以被收获了!");
	}
}

//具体产品类
class Crap implements FreshWaterFish{

	@Override
	public void grow() {
		System.out.println("鲤鱼正在生长!");
	}

	@Override
	public void harvset() {
		System.out.println("鲤鱼可以收获了!");
	}
}

//具体产品类
class Catfish implements FreshWaterFish{

	@Override
	public void grow() {
		System.out.println("鲇鱼正在生长!");	
	}

	@Override
	public void harvset() {
		System.out.println("鲇鱼可以收获了!");
	}
}

//简单工厂类
public class SimpleProductFactory {
	
	public static FreshWaterFish productFish(String fishName){
		switch (fishName) {
		case "grasscarp":
			return new Grasscarp();
		case "crap":
			return new Crap();
		case "catfish":
			return new Catfish();
		default:
			System.out.println("工厂没有生产这种鱼类!");
			return null;
		}
	}
	
	//客户调用
	public static void main(String[] args) {
		FreshWaterFish fish = SimpleProductFactory.productFish("grasscarp");
		if(fish!=null){
			fish.grow();
			fish.harvset();
		}
		
		FreshWaterFish fish2 = SimpleProductFactory.productFish("crap");
		if(fish2!=null){
			fish2.grow();
			fish2.harvset();
		}
		
		FreshWaterFish fish3 = SimpleProductFactory.productFish("yellow");
		if(fish3!=null){
			fish3.grow();
			fish3.harvset();
		}
	}
}

运行结果如下:


由此可以看出来,简单工厂负责了很多内部的细节,把创建对象的工作放在工厂内部,用户可以直接通过传入对应的鱼名得到鱼 的对象,而这样做有什么好处呢?

1.这让客户免除了之间创建产品对象的责任,仅仅消费产品,简单工厂模式将对象的创建与对象的使用分离开来,有利于对功能的复用和系统的维护。

2.降低代码的耦合度,比如万一场中某一种鱼突然间不生产了,如果用户之间用new关键字去创建的话,那么代码中所有的和该鱼相关的代码均得修改,而简单工厂模式由于是父类接受子类创建的对象,仅仅需要修改创建时的一行代码即可,其余方法仍可以继续使用,这也恰恰体现了java多态给我们带来的好处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值