工厂模式

作者: 蓝色_fea0 | 来源:发表于2018-05-25 18:06 被阅读65次

    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模式)

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

    相关文章

      网友评论

        本文标题:工厂模式

        本文链接:https://www.haomeiwen.com/subject/lgqujftx.html