工厂模式(3)方法工厂模式

      前言:经过前篇文章的学习,大家应该形成一种潜意识,那就是不管什么设计模式,它的核心目的是为了解决开发中遇到的问题。完

美的解决问题则需要遵循一些原则,比如开闭原则、单一原则、里氏替换原则、依赖倒转原则、接口隔离原则、迪米特法则和合成复用原

则,一句话设计模式为了程序的扩展性好,易于维护和升级。




      开发就像打仗一样,如果双方实力一样最开始会硬钢,但是如果一边人少还想赢得战争只能想套路了,于是就有了《孙子兵法》《三


十六计》,书里面告诉了我们应该用什么计谋应对特定的情况,比如《三十六计》就有胜战计、敌战计、攻战计、混战计、并战计、败战


计,其实更多的时候是多种计谋一起使用,比如王允使用美人计+连环计巧杀董卓。学习更多设计模式之后你还会面临设计模式选择的问


题,比如金蝉脱壳和走为上策有什么区别,关于这些就属于设计模式高深的内容了,请持续关注我们设计模式后续的内容。。。


                            工厂模式(3)方法工厂模式


      问题描述:上次小张使用简单工厂模式完美的解决了埃及猫与波斯猫的创建问题,而且小张感觉自己的代码是可以完美扩展的.


public class TestEasyFactory {
	public static void main(String[] args) {
		//向工厂模式传参并创建对象
		Cat cat = CatFactory.create(CatType.PersianCat);
	}
}

class CatFactory {
	public static Cat create(CatType type) {
		Cat cat = null;
		//判断猫的类型创建对象
		if (CatType.PersianCat == type) {
			cat = new PersianCat();
		} else if (CatType.Egypt == type) {
			cat = new EgyptCat();
		}
		return cat;
	}
}

interface Cat {

}

class EgyptCat implements Cat {
	public void run() {
		System.out.println("EgyptCat.run()");
	}
}

class PersianCat implements Cat {
	public void run() {
		System.out.println("PersianCat.run()");
	}
}

enum CatType {
	PersianCat, Egypt
}

      但是随着越来越多猫的类型加入,小张发现自己的工厂判断代码要不断的更新判断逻辑,其实这暴露出两个问题:


            1、我们开发过的代码不应该被大量修改,如果三个程序员同时修改一个文件难免出现不熟悉鄙人的业务而出现错误


            2、如果产品太多不应该让一个工厂处理所有的创建,这会让这个工厂类变的臃肿而增加控制成本,比如你不能依靠一个工厂创建


                奔驰的跑车和商务车,而应该多个工厂各司其职。


      小张意识到这个问题之后于是将代码修改如下


public class TestMethodFactory {
	public static void main(String[] args) {
		// 向工厂模式传参并创建对象
		CatFactory factory = new EgyptCatFactory();
		// 创建猫对象
		Cat cat = factory.create();
	}
}

interface Cat {

}

interface CatFactory {
	public Cat create();
}

class EgyptCat implements Cat {
	public void run() {
		System.out.println("EgyptCat.run()");
	}
}

class EgyptCatFactory implements CatFactory {
	@Override
	public Cat create() {
		return new EgyptCat();
	}
}

class PersianCat implements Cat {
	public void run() {
		System.out.println("PersianCat.run()");
	}
}

class PersianCatFactory implements CatFactory {
	@Override
	public Cat create() {
		return new PersianCat();
	}
}

      通过对上述代码的观察,我们大概可以发现两件事情:


            1、核心工厂类不会被别人修改,以后无论增加什么子类,只需要创建子类并创建子类的工厂类即可


            2、以后每个对象创建都会由自己的工厂类实现,即使创建过程再复杂也不会对别人的代码产生干扰,而且分工明确,扩展性极好


      以上两点就是方法工厂模式的核心思想。


                                         工厂模式(3)方法工厂模式


      天要下雨需求要变是阻拦不了的,现在宠物医院规模变大,增加了小狗类和小猫类,而且还分为观赏型和运动型宠物,将来有可能还


会把老鼠加进来,那么你感觉这会给小张的开发带来什么难点呢?


      请继续关注我们后续的文章《工厂模式(4)抽象工厂模式》