1、概述:
工厂模式是Java中最常用的一种设计模式之一,它属于创建型模式,需要生成的对象叫做产品 ,生成对象的地方叫做工厂 。
2、场景:
任何需要创建复杂对象的地方,都可以使用工厂模式。使用new可以创建的地方不需要工厂模式,spring的IOC所使用的就是工厂模式。
3、分类:
3.1、简单工厂模式(也叫静态工厂模式)
实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承一个父类或接口)的实例。简单工厂的创建目标。所有创建的对象都是充当这个角色的某个具体的实例
方式一:使用switch方式
创建一个Animal抽象类或者接口
public interface Animals {
void hello();
}
创建相应的动物实现类
public class Cat implements Animals{
@Override
public void hello() {
System.out.println("喵喵喵!!!");
}
}
public class Dog implements Animals{
@Override
public void hello() {
System.out.println("汪汪汪汪!!!");
}
}
实现简单工厂模式:
方式1:使用switch语句
/**
* 简单工厂模式 实现方式一 使用switch
*/
public class SimpleFactory {
public static final int CAT = 1;
public static final int DOG = 2;
public static Animals getAnimal(Integer type){
switch (type){
case CAT:
return new Cat();
case DOG:
return new Dog();
default:
return new Dog();
}
}
}
//测试方法
public class Main {
public static void main(String[] args) {
Animals animal = SimpleFactory.getAnimal(SimpleFactory.CAT);
animal.hello();
}
}
测试结果:
测试结果
方式2:使用反射
/**
* 简单工厂模式实现方式二,
*/
public class SimpleFactory {
public static <T extends Animals> T getAnimal(Class<T> clazz){
T result = null;
try {
result = (T) Class.forName(clazz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
//测试方法
public class Main {
public static void main(String[] args) {
Animals animal = SimpleFactory.getAnimal(Dog.class);
animal.hello();
}
}
测试结果:
测试结果
3.2、工厂方法模式(也叫多形性工厂模式)
工厂方法模式是颗粒度很小的设计模式,因为模式的表现只是一个抽象的方法。提前定义用于创建对象的接口,让子类决定实例化具体的某一类,即在工厂模式和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体实例去实现
public class MethodFactory {
public static Animals getCat(){
return new Cat();
}
public static Animals getDog(){
return new Dog();
}
}
//测试方法
public class Main {
public static void main(String[] args) {
Animals cat = MethodFactory.getCat();
cat.hello();
}
}
测试结果:
测试结果
3.3、抽象工厂模式(也叫工具箱)
当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端不必指定产品的具体情况下,创建多个产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类。每个工厂类可以创建多个具体产品的实例。
新增一个鸟的接口和啄木鸟的类
//鸟的接口
public interface Bird {
void hello();
}
//啄木鸟的类
public class zhuomuBird implements Bird {
@Override
public void hello() {
System.out.println("捉捉捉桌!!!");
}
}
创建一个抽象工厂再创建一个猫工厂
public interface AbstractFactory {
Animals createAnimals();
Bird createBird();
}
//创建猫工厂,继承抽象工厂
public class CatFactory implements AbstractFactory{
@Override
public Animals createAnimals() {
return new Cat();
}
@Override
public Bird createBird() {
return new zhuomuBird();
}
}
//测试数据
public class Main {
public static void main(String[] args) {
AbstractFactory abstractFactory = new CatFactory();
Animals animals = abstractFactory.createAnimals();
animals.hello();
Bird bird = abstractFactory.createBird();
bird.hello();
}
}
测试结果:
测试结果
4、总结
一句话总结工厂模式:方便创建 同种产品类型的 复杂参数 对象
工厂模式重点就是适用于 构建同产品类型(同一个接口 基类)的不同对象时,这些对象new很复杂,需要很多的参数,而这些参数中大部分都是固定的,so,懒惰的程序员便用工厂模式封装之。
(如果构建某个对象很复杂,需要很多参数,但这些参数大部分都是“不固定”的,应该使用Builder模式)
为了适应程序的扩展性,拥抱变化,便衍生出了抽象工厂等模式。
网友评论