简单工厂模式属于创建型模式,所以是关于创建对象的,举例说明:
需求:创建动物中的猫、狗对象。
首先绘制简单工厂模式的类图:
下面进行代码实现,通过一般方法和应用简单工厂模式方法的代码进行对比,研究简单工厂方法的实际应用与意义:
1、按照一般方法创建猫、狗对象:
<span style="font-size:14px;">//主类
public class AnimalTest {
public static void main(String[] args) {
//创建狗对象并调用方法
Dog d = new Dog();
d.eat();
//创建猫对象并调用方法
Cat c = new Cat();
c.eat();
}
}
//提炼出抽象类动物类
public abstract class Animal {
public abstract void eat();
}
//猫类要继承动物类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
}
//狗类继承动物类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
</span>
但是,这样就出现一个问题:我们知道,创建对象其实没那么简单,它可能会做很多类似初始化等的事情,是一个比较复杂的事情,尤其是我们需要成百上千个对象时,我们都要在main方法中创建吗?那么,我们不应该在main方法中进行这些事情,因为main方法主要是对象调用功能,而不应该把主方法做的很复杂,所以,我们应该将创建对象这件事交给别人去做,也就是
单独分出一个类来专门创建对象
,这就引出来简单工厂模式,这种类就叫做工厂类。
2、用简单工厂模式实现创建猫、狗对象:
<span style="font-size:14px;">//主类
public class AnimalTest {
public static void main(String[] args) {
//通过传入“dog”参数来创建狗的对象
Animal a = AnimalFactory.createAnimal("dog");
a.eat();
//通过传入“cat”参数来创建猫的对象
a = AnimalFactory.createAnimal("cat");
a.eat();
}
}
//工厂类
public class AnimalFactory {
private AnimalFactory() {
}
//定义一个根据传入参数创建对象的方法
public static Animal createAnimal(String type) {
//如果传入参数是“dog”就创建dog对象
if ("dog".equals(type)) {
return new Dog();
//如果传入参数是“cat”就创建cat对象
} else if ("cat".equals(type)) {
return new Cat();
//其他情况返回null
} else {
return null;
}
}
}
//提炼出抽象类动物类
public abstract class Animal {
public abstract void eat();
}
//猫类要继承动物类
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃老鼠");
}
}
//狗类继承动物类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
</span>
小结:可以看出,我们现在专门分出了一个类来创建对象,在主方法中调用方法就能够创建出所需要的对象,这样,减轻了主方法的负担,使得代码更加清晰易读,到现在,我们就已经按照最基本的简单工厂模式,把需求给完成了。也可以知道,简单工厂模式的实质就是将创建对象这一功能分出来交给专门的类去负责。
但是,现在还有一个问题,那就是:如果我还要创建鱼的对象,那么我就要去添加鱼这个类,然后去更改工厂类,添加创建鱼的对象的方法,那么,这样就违背了面向对象的设计原则:开闭原则(对修改关闭,对扩展开放)。
那么,怎么样才能够使工厂做的更好呢?请关注下篇文章:《设计模式之--工厂方法》