java设计模式之2—工厂方法模式结合生活代码理解

简单介绍

此模式本质还是一个创建型的模式,其意义创建一个对象工厂接口,将实际的创建工作交由子类创建,核心工厂类不再关注类的创建过程,而关心子类工厂共有的必须实现的接口。

此模式要素

要想实现工厂方法模式,我们需要的要素有:
首先要有具体的角色,即具体的实例(菜肴)。
要有共同的抽象(锅碗瓢盆)。
及具体的工厂(饭店)。
还有抽象工厂(餐饮公司)。

这么一大段话,什么意思呢?

接着简单工厂模式聊(没看过的朋友可以阅读一下)
本人之前找到了一家能够满足我所有口味的饭店,相当满足,但是有一天,我的口味发生了变化,而饭店做不到,我生气了,和饭店一刀两断(这是简单工厂模式的弊端,和我的文章对应)。多年后,我富甲一方(西虹市首富),我一气之下,成立了餐饮公司(这就是抽象工厂),餐饮公司旗下有川菜馆和鲁菜馆(这就是具体的工厂),合我的口味,这些菜馆里面都有为我生财的工具,锅碗瓢盆(共同的抽象),这两家饭馆能做出我想吃的菜(具体的实例)
突然有一天,我想吃粤菜,没办法,有钱,不想去别家吃,餐饮公司旗下多了一家饭馆,粤菜馆(具体的工厂’粤菜馆’继承自抽象工厂’餐饮公司’,有共同的抽象’锅碗瓢盆’),于是我又美滋滋的吃到了粤菜。

比简单工厂模式好在哪?

工厂方法模式核心是工厂抽象类
简单工厂模式核心是工厂类

当我们的系统需要有新的对象支撑业务时,只需要添加具体的对象和对象对应的工厂即可,对原有的对象及工厂没有任何修改,这符合了我们做软件的一个原则,”开放-封闭”原则,对扩展是开发的,对修改是封闭的。
而简单工厂模式在添加新的对象后不得不修改工厂的方法,扩展性不好,违反”开放-封闭”原则。

实现代码演进

代码可在码云中下载(包名为b_factoryMethod)
https://gitee.com/XiaoSa12138/java-models

实现(好处在后面)

/**
 * 饭店肯定是用一套锅碗瓢盆(共同的抽象)
 */
public interface Cai {
	void get();
}
/**
 * 川菜
 */
public class ChuanCai implements Cai {
	public void get(){
		System.out.println("麻婆豆腐.....");
	}
}
/**
 * 鲁菜
 */
public class LuCai implements Cai {
	public void get(){
		System.out.println("糖醋鲤鱼.....");
	}
}

/**
 * 工厂抽象类(就是餐饮公司)
 */
public interface CaiFactory {
	Cai getCai();
}
/**
 * 川菜工厂类(川菜馆)
 */
public class ChuanCaiFactory implements CaiFactory {
	public Cai getCai() {
		return new ChuanCai();
	}
}
/**
 * 鲁菜工厂类(鲁菜馆)
 */
public class LuCaiFactory implements CaiFactory {
	public Cai getCai() {
		return new LuCai();
	}
}
/**
 * 主类
 */
public class Main {
	//告诉餐饮公司需要什么菜,公司就去旗下对应的菜馆做就可以了
	public static void main(String[] args) {
		CaiFactory chuanF = new ChuanCaiFactory();
		Cai chuanCai = chuanF.getCai();
		chuanCai.get();
		
		CaiFactory luF = new LuCaiFactory();
		Cai luCai = luF.getCai();
		luCai.get();
	}
}

这时候,好处就来了,想吃粤菜,餐饮公司有钱就行了,我不再操心

/**
 * 粤菜
 */
public class YueCai implements Cai {
	public void get(){
		System.out.println("烧鹅.....");
	}
}
/**
 * 粤菜工厂类(粤菜馆)
 */
public class YueCaiFactory implements CaiFactory {
	public Cai getCai() {
		return new YueCai();
	}
}
/**
 * 主类修改
 */
public class Main {
	//告诉餐饮公司需要什么菜,公司就去旗下的菜馆做就可以了,对之前的川菜和鲁菜馆没影响
	public static void main(String[] args) {
		CaiFactory chuanF = new ChuanCaiFactory();
		Cai chuanCai = chuanF.getCai();
		chuanCai.get();
		
		CaiFactory luF = new LuCaiFactory();
		Cai luCai = luF.getCai();
		luCai.get();
		
		//扩展性
		CaiFactory YueF = new YueCaiFactory();
		Cai yueCai = YueF.getCai();
		yueCai.get();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42997554/article/details/84530765