最近在看《大话设计模式》,想好好学习下设计模式,并写一点自己学习过程中的体会以及遇到的疑问,希望能给初学者以帮助,更希望大家能指出我的不足和错误,在此感谢各位看客。
简单工厂模式:
简单工厂模式可以说是设计模式里最简单但是应用却是最广的一种模式,我们随便举个例子来看下它的好处。
话说咱家养了好多小动物,比如阿猫、阿狗、奥特曼什么的,猫吃鱼,狗吃肉,奥特曼吃小怪兽。现在我们想知道随便抓一只动物出来,它吃的是什么,不用设计模式的话是这么实现的:
public class Cat {
public Cat() {}
public void eat() {
System.out.println("猫吃鱼");
}
}
public class Dog {
public Dog() {}
public void eat() {
System.out.println("狗吃肉");
}
}
public class Ultraman {
public Ultraman () {}
public void eat() {
System.out.println("奥特曼吃小怪兽");
}
}
public class MainClass {
/**
* 具体业务实现代码
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String animalName = null;
System.out.println("Please enter the name of the animal:");
animalName = br.readLine();
if("Dog".equals(animalName)) {
Dog dog = new Dog();
dog.eat();
} else if("Cat".equals(animalName)) {
Cat cat = new Cat();
cat.eat();
} else if("Ultraman".equals(animalName)) {
Ultraman ulMan = new Ultraman();
ulMan.eat();
}
}
}
这种写法的缺点:
1、如果刚好咱家开的是动物园,将会有无数个if...else
2、如果我们不仅仅想知道小动物们吃啥,还想知道动物它们拉些啥粑粑,这时候就要往所有if...else里加拉粑粑的方法,这些重复代码将随动物越多产生越多工作量
3、所有if...else里的动作都是类似的操作,当里面的操作非常多的时候将产生大量代码,不容易维护
现在我们使用简单工厂方法来改进代码:
public interface Animal {
public void eat();
}
public class Cat implements Animal{
public Cat() {}
public void eat() {
System.out.println("猫吃鱼");
}
}
//狗类和奥特曼类省略
...
/**
* 工厂类,创建各种动物
* @author link
*/
public class OperationFactory {
public static Animal createAnimal(String animalName) {
Animal animal = null;
if("Dog".equals(animalName)) {
animal = new Dog();
} else if("Cat".equals(animalName)) {
animal = new Cat();
} else if("Ultraman".equals(animalName)) {
animal = new Ultraman();
}
return animal;
}
}
public class MainClass {
/**
* 具体业务实现代码
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String animalName = null;
System.out.println("Please enter the name of the animal:");
animalName = br.readLine();
//使用工厂方法,根据动物名称获取动物实例
Animal animal = OperationFactory.createAnimal(animalName);
//调用动物“吃”的方法,无需理会到底这是阿猫、阿狗还是奥特曼
animal.eat();
}
}
运行MainClass,
Please enter the name of the animal:
Ultraman
奥特曼吃小怪兽
使用简单工厂方法的优点:
1、即使我们开动物园了,也只需要在工厂类中添加相应动物的初始化方法就行了,如果使用反射进行初始化还可以去掉所有的if...else,使代码更加简洁。更重要的是:无论增加多少动物都不会影响业务代码(这里说的业务代码指main方法中代码)。
2、我们的业务代码将会简洁非常多,并且不需要在业务代码中重复调用各种动物的eat()方法,即使我们想知道动物们都拉啥粑粑,也只需要在业务代码中加上一行代码就行了,而不像普通代码需要在if...else所有的判断中各加一行(现实工作中可能就是各加几十行上百行了)。
从设计上来说,使用简单工厂方法降低了代码的耦合度,将最有可能发生变动、进行扩展的代码提取出来了,从而保证了业务代码的简洁和相对稳定性。