工厂模式

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();
    }
}

测试结果:
12350543-d0bdda0580f19e3e.jpg
测试结果

方式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();
    }
}

测试结果:
12350543-9d9e339c538aa1a1.jpg
测试结果

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();
    }
}

测试结果:
12350543-d0bdda0580f19e3e.jpg
测试结果

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();
    }
}

测试结果:
12350543-656b7fb82bdaab9d.jpg
测试结果

4、总结

一句话总结工厂模式:方便创建 同种产品类型的 复杂参数 对象

工厂模式重点就是适用于 构建同产品类型(同一个接口 基类)的不同对象时,这些对象new很复杂,需要很多的参数,而这些参数中大部分都是固定的,so,懒惰的程序员便用工厂模式封装之。
(如果构建某个对象很复杂,需要很多参数,但这些参数大部分都是“不固定”的,应该使用Builder模式)

为了适应程序的扩展性,拥抱变化,便衍生出了抽象工厂等模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值