简单工厂模式
1、概述
简单工厂模式 又叫静态工厂方法模式,它定义一个具体的工厂类来负责创建一些类的实例。
如:Dog类对象,不再在程序中使用new Dog()的方式来创建了。而是先定义一个DogFactory类,在该类中有负责创建Dog的代码,且对外提供一个获取Dog实例的静态方法。我们在客户端程序中要使用到Dog对象,通过 Dog dog = DogFactory.createDog();来获取Dog的实例即可。
2、 优缺点
优点:客户端不需要再负责对象的创建,从而明确了各个类的职责。
缺点:这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期的维护。
3、代码演示
环境代码搭建:
定义一个 Animal 动物抽象类
// 动物抽象类
public abstract class Animal {
public abstract void eat(); // 吃 的 功能
}
定义一个Dog类
// 狗类
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("笨狗吃骨头...");
}
}
定义一个Rabbit 类
// 兔类
public class Rabbit extends Animal {
@Override
public void eat() {
System.out.println("兔子爱吃隔壁草...");
}
}
代码测试
代码1:常规的方式:
public class AnimalDemo {
public static void main(String[] args) {
//1、传统的方式: 先创建具体类,再调用方法。
Dog d = new Dog();
Rabbit r = new Rabbit();
d.eat();
r.eat();
}
}
笨狗吃骨头...
兔子爱吃隔壁草..
代码2:通过工厂造各种 动物对象
定义一个 AnimalFactory 动物工厂 类
public class AnimalFactory {
// 1、构造方法私有。避免在其它类中,可以使用new的方式来创建AnimalFactory对象。
private AnimalFactory() {
}
// 2.1、 提供一个创建Dog类对象的功能。且对外提供一个获取Dog实例的方法。因此是public修饰。
// 注意:因为承接上面第一点,该工厂类不能在其他类中创建对象。因此,该方法必须是static的。
// 其他程序中获取Dog实例的方式:Dog dog = AnimalFactory.createDog();
public static Dog createDog() {
return new Dog();
}
// 2.2 提供一个创建Rabbit类对象的功能。(同理)
public static Rabbit createRabbit() {
return new Rabbit();
}
}
测试
public class AnimalDemo {
public static void main(String[] args) {
// 简单工厂
Animal animal = AnimalFactory.createDog();
animal.eat();
animal = AnimalFactory.createRabbit();
animal.eat();
}
}
笨狗吃骨头...
兔子爱吃隔壁草...
代码3:对工厂改进后
package com.monkey1028;
public class AnimalFactory {
// 1、构造方法私有
private AnimalFactory() {
}
// 2、根据用户传入的动物名来创建相应的动物实例。
public static Animal createAnimal(String type) {
if("dog".equals(type)) {
return new Dog();
}
if("rabbit".equals(type)) {
return new Rabbit();
}else {
return null;
}
}
}
测试类:
public class AnimalDemo {
public static void main(String[] args) {
// 通过 AnimalFactory 动物工厂 造相应的动物对象
Animal a = AnimalFactory.createAnimal("dog");
a.eat();
a = AnimalFactory.createAnimal("rabbit");
a.eat();
// 要是传入动物工厂中不存在的动物对象呢?
// 会产生空指针异常,所以要做判断
System.out.println();
a = AnimalFactory.createAnimal("pig");
if(a != null) {
a.eat();
}else {
System.out.println("该工厂还暂时不具备生产该动物的资质......");
}
}
}
结果:
笨狗吃骨头...
兔子爱吃隔壁草...
该工厂还暂时不具备生产该动物的资质......