定义:
属于创建模式的一种。在创建对象的时候,不会对客户端暴露创建逻辑,只提供一个共同的接口指向新创建的对象。定义一个创建对象的接口,让子类决定实例化哪一个工厂类,将创建对象的过程延迟到子类进行。
应用场景:
接口选择。主要解决,在确定的情况下,根据不同条件创造不同的实例。
优点:
- 屏蔽实例对象的具体创造逻辑,调用者只了解创造对象的接口就可以了
- 调用者想要哪一种类型对象,只需要告诉工厂这个对象的唯一标识(名称,枚举,属性值)就可以
- 可扩展性高,如果需要新增加一个子类,只需要增加一个工厂类和一个子类就可以
缺点:
- 也是第三个优点,那么就是,每次增加一个子类,都需要再增加一个工厂类,增加代码冗余
应用实例:
- ORM框架适配数据库,框架只需要更换数据库的方言和驱动就可以使用。
- 日志记录。用户可以选择日志记录在数据库、硬盘等。
-
远程服务类型。rest和webservice。
演示代码:
接口定义:
package com.study.designPattern.factoryPattern.factoryInterface;
/**
* 简单工厂模式,动物接口
*/
public interface Animal {
/**
* 说话方法
*/
void say();
}
实现类定义:
Dog:
package com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factoryInterface.impl;
import com.study.designPattern.factoryPattern.factoryInterface.Animal;
public class Dog implements Animal {
@Override
public void say() {
System.out.println("我是一只小狗子,我说汪汪汪");
}
}
Cat:
package com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factoryInterface.impl;
import com.study.designPattern.factoryPattern.factoryInterface.Animal;
public class Cat implements Animal {
@Override
public void say() {
System.out.println("我是一只小猫咪,我说喵喵喵");
}
}
Pig:
package com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factoryInterface.impl;
import com.study.designPattern.factoryPattern.factoryInterface.Animal;
public class Pig implements Animal {
@Override
public void say() {
System.out.println("我是一只小猪猪,我说哼哼哼");
}
}
工厂类:
package com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factory;
import com.study.designPattern.factoryPattern.factoryInterface.Animal;
import com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factoryInterface.impl.Cat;
import com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factoryInterface.impl.Dog;
import com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factoryInterface.impl.Pig;
/**
* 工厂模式,动物工厂
*/
public class AnimalFactory {
/**
* 根据动物类型创造动物
* @param animalType
* @return
*/
public Animal createAnimal(String animalType){
switch (animalType){
case "DOG":
return new Dog();
case "CAT":
return new Cat();
case "PIG":
return new Pig();
default:
return null;
}
}
}
测试类:
package com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern;
import com.study.designPattern.factoryPattern.factoryInterface.Animal;
import com.study.designPattern.factoryPattern.factoryInterface.com.study.designPattern.factoryPattern.factory.AnimalFactory;
public class AnimalDemo {
public static void main(String[] args) {
AnimalFactory animalFactory = new AnimalFactory();
Animal dog = animalFactory.createAnimal("DOG");
dog.say();
System.out.println("---------我是一个分割线-------");
Animal cat = animalFactory.createAnimal("CAT");
cat.say();
System.out.println("---------我是一个分割线-------");
Animal pig = animalFactory.createAnimal("PIG");
pig.say();
}
}
结果: