静态工厂模式
程序员文章站
2022-05-23 15:56:05
...
定义:将对象的创建过程交由专门的对象(工厂)去做,通过给工厂的方法传入不同的参数完成不同对象的创建,或者调用工厂的不同方法创建不同的对象。
例子:
有一个动物接口,两个类实现了该接口,一个是猫类,一个是狗类。有一个动物生产工厂,根据客户端传入不同的参数或者调用不同的方法返回不同的实现类对象。
动物接口:有一个叫的方法
/**
* 动物
* @author z_hh
* @time 2018年8月6日
*/
public interface Animal {
void shout();
}
猫类
/**
* 猫
* @author z_hh
* @time 2018年8月6日
*/
public class Cat implements Animal {
@Override
public void shout() {
System.out.println("喵喵喵");
}
}
狗类
/**
* 狗
* @author z_hh
* @time 2018年8月6日
*/
public class Dog implements Animal {
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
动物工厂:根据客户端传入不同的参数或者调用不同的方法返回不同的实现类对象
/**
* 动物工厂
* @author z_hh
* @time 2018年8月6日
*/
public class AnimalFactory {
//********** 第一种实现方式:传入不同参数生成不同对象 **********//
public static Animal create(AnimalType animalType) {
switch (animalType) {
case CAT:
return new Cat();
case DOG:
return new Dog();
default:
throw new IllegalArgumentException();
}
}
public enum AnimalType {
CAT, DOG
}
//********** 第二种实现方式:调用不同方法生成不同对象 **********//
public static Cat createCat() {
return new Cat();
}
public static Dog createDog() {
return new Dog();
}
}
客户端&测试
public class Test {
public static void main(String[] args) {
Animal animal = null;
//********** 第一种实现方式:传入不同参数生成不同对象 **********//
System.out.println("********** 第一种实现方式:传入不同参数生成不同对象 **********");
animal = AnimalFactory.create(AnimalType.DOG);
animal.shout();
animal = AnimalFactory.create(AnimalType.CAT);
animal.shout();
//********** 第二种实现方式:调用不同方法生成不同对象 **********//
System.out.println("********** 第二种实现方式:调用不同方法生成不同对象 **********");
animal = AnimalFactory.createDog();
animal.shout();
animal = AnimalFactory.createCat();
animal.shout();
}
}
结果
总结
优点:
- 隐藏了对象创建的细节,将实例化过程放到了工厂类中实现,起到了解耦的作用。
- 客户端基本不用关心使用的是哪个产品,只需要知道用工厂的哪个方法(或者传入什么参数)就行了。
- 方便添加新的子类,只需要在工厂类的创建方法添加分支,或者增加创建方法就可以了。
- 遵循了依赖倒转原则,即不用自己负责对象的创建。
缺点:
- 适用于产品子类型差不多, 使用的方法名都相同的情况。
- 每添加一个产品子类,都必须在工厂类中添加一个判断分支(或一个方法),这违背了OCP(开放-封闭原则)。