Java工厂模式

Java工厂模式Java工厂模式介绍工厂模式(FactoryPattern)是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。实例:1、您需要一辆奥迪汽车,可以直接从奥迪工厂里面提货,而不用去管这辆奥迪汽车是怎么做出来的,以及这个汽车里面的具体实现。优点:1、一个调用者想创建一个对象,只要知道其名称就可以了。2、扩展性高,如果想增加一个新的产品,只

Java工厂模式

介绍

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

实例: 1、您需要一辆奥迪汽车,可以直接从奥迪工厂里面提货,而不用去管这辆奥迪汽车是怎么做出来的,以及这个汽车里面的具体实现。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个新的产品,只要扩展一个新工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

注意事项: 在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 几次对象就不用了, 这种情况,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

普通工厂

定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类
工厂方法让类的实例化推迟到子类中进行

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory

然后使用FactoryPatternDemo类,来访问 ShapeFactory 来获取 Shape 对象。 以便获取它所需对象的类型。

Java工厂模式

从这张图我们可以看出来 Circle(圆形), Square(方形) ,Rectangle(矩形) 这 三个类都继承了Shape(形状)接口 而 这些类都交给ShapeFactory类来管理

我们使用FactorypattemDemo类来测试 访问ShapeFactory形状工厂 获取想要的 形状对象

Java工厂模式

接口Shape

public interface Shape { 
   
    void draw();
}

实现类 Circle

public class Circle implements Shape { 
   

    @Override
    public void draw() { 
   
        System.out.println("Inside Circle::draw() method.");
    }
}

实现类Rectangle

public class Rectangle implements Shape { 
   

    @Override
    public void draw() { 
   
        System.out.println("Inside Rectangle::draw() method.");
    }
}

实现类 Square

public class Square implements Shape { 
   

    @Override
    public void draw() { 
   
        System.out.println("Inside Square::draw() method.");
    }
}

工厂ShapeFactory

public class ShapeFactory { 
   

    //使用 getShape 方法获取形状类型的对象
    public static Shape getShape(String shapeType){ 
   
        //如果传入的字符串为空
        if(shapeType == null||shapeType.trim().equals("")){ 
   
            return null;
        }

        // 更具 传进来的 名称 来获取 对应的对象
        if(shapeType.equalsIgnoreCase("CIRCLE")){ 
   
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 
   
            return new Rectangle();
        } else if(shapeType.equalsIgnoreCase("SQUARE")){ 
   
            return new Square();
        }
        return null;
    }
}

测试FactoryPatternDemo

public class FactoryPatternDemo { 
   
    public static void main(String[] args) { 
   

        //获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = ShapeFactory.getShape("CIRCLE");
        //调用 Circle 的 draw 方法
        shape1.draw();

        //获取 Rectangle 的对象,并调用它的 draw 方法
        Shape shape2 = ShapeFactory.getShape("RECTANGLE");
        //调用 Rectangle 的 draw 方法
        shape2.draw();

        //获取 Square 的对象,并调用它的 draw 方法
        Shape shape3 = ShapeFactory.getShape("SQUARE");
        //调用 Square 的 draw 方法
        shape3.draw();


    }

}

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

抽象工厂

从上面案例中我们可以发现 工厂模式是 挺好用的 但是会暴露一个问题就是 随着业务的增多 那么工厂也对应增多 造成了难以管理

如何解决这个问题呢 ? 可以使用 抽象工厂来管理所有的工厂

Java工厂模式

从这张图我们可以看出来有 2个工厂 一个是形状工厂 一个是颜色工厂 而这些工厂 都交给了 AbstractFactory这个大抽象工厂来管理

既然是抽象工厂 我们需要子类FactoryProducer(工厂生产)来实现 然后通过AbstractFactoryPatternDemo 测试类来 访问FactoryProducer 生产我们需要的工厂(形状工厂或者颜色工厂) 然后在通过对应的工厂生产指定的对象

Java工厂模式

抽象工厂AbstractFactory

public abstract class AbstractFactory { 
   
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape) ;
}

形状工厂

接口Shape

public interface Shape { 
   
    void draw();
}

实现类 Circle

public class Circle implements Shape { 
   

    @Override
    public void draw() { 
   
        System.out.println("Inside Circle::draw() method.");
    }
}

实现类Rectangle

public class Rectangle implements Shape { 
   

    @Override
    public void draw() { 
   
        System.out.println("Inside Rectangle::draw() method.");
    }
}

实现类 Square

public class Square implements Shape { 
   

    @Override
    public void draw() { 
   
        System.out.println("Inside Square::draw() method.");
    }
}

工厂 ShapeFactory

public class ShapeFactory extends AbstractFactory { 
   
    //使用 getShape 方法获取形状类型的对象
    @Override
    public Shape getShape(String shapeType){ 
   
        //如果传入的字符串为空
        if(shapeType == null||shapeType.trim().equals("")){ 
   
            return null;
        }

        // 更具 传进来的 名称 来获取 对应的对象
        if(shapeType.equalsIgnoreCase("CIRCLE")){ 
   
            return new Circle();
        } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 
   
            return new Rectangle();
        } else if(shapeType.equalsIgnoreCase("SQUARE")){ 
   
            return new Square();
        }
        return null;
    }

    @Override
    public Color getColor(String color) { 
   
        return null;
    }
}

颜色工厂

接口Color

public interface Color { 
   
    void fill();
}

实现类Red

public class Red implements Color { 
   

    @Override
    public void fill() { 
   
        System.out.println("Inside Red::fill() method.");
    }
}

实现类Green

//绿色
public class Green implements Color { 
   

    @Override
    public void fill() { 
   
        System.out.println("Inside Green::fill() method.");
    }
}

实现类Blue

public class Blue implements Color { 
   

    @Override
    public void fill() { 
   
        System.out.println("Inside Blue::fill() method.");
    }
}

工厂ColorFactory

public class ColorFactory extends AbstractFactory { 
   
    @Override
    public Color getColor(String color) { 
   
        if(color == null||color.trim().equals("")){ 
   
            return null;
        }
        if(color.equalsIgnoreCase("RED")){ 
   
            return new Red();
        } else if(color.equalsIgnoreCase("GREEN")){ 
   
            return new Green();
        } else if(color.equalsIgnoreCase("BLUE")){ 
   
            return new Blue();
        }
        return null;
    }

    @Override
    public Shape getShape(String shape) { 
   
        return null;
    }
}

生产工厂类 FactoryProducer

public class FactoryProducer { 
   
    public static AbstractFactory getFactory(String choice){ 
   
        if(choice.equalsIgnoreCase("SHAPE")){ 
   
            return new ShapeFactory();
        } else if(choice.equalsIgnoreCase("COLOR")){ 
   
            return new ColorFactory();
        }
        return null;
    }
}

测试AbstractFactoryPatternDemo

public class AbstractFactoryPatternDemo { 
   
    public static void main(String[] args) { 
   
        //获取形状工厂
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
        //获取形状为 Circle 的对象
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        //调用 Circle 的 draw 方法
        shape1.draw();

        
        //获取颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
        //获取颜色为 Blue 的对象
        Color color1 = colorFactory.getColor("BLUE");
        //调用 Blue 的 fill 方法
        color1.fill();
    }
}

Inside Circle::draw() method.
Inside Blue::fill() method.


点赞 -收藏-关注-便于以后复习和收到最新内容


有其他问题在评论区讨论-或者私信我-收到会在第一时间回复


如有侵权,请私信联系我


感谢,配合,希望我的努力对你有帮助^_^

Java工厂模式

今天的文章Java工厂模式分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6226.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注