Java工厂模式
介绍
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
实例: 1、您需要一辆奥迪汽车,可以直接从奥迪工厂里面提货,而不用去管这辆奥迪汽车是怎么做出来的,以及这个汽车里面的具体实现。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个新的产品,只要扩展一个新工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
注意事项: 在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 几次对象就不用了, 这种情况,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
普通工厂
定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类
工厂方法让类的实例化推迟到子类中进行
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
然后使用FactoryPatternDemo类,来访问 ShapeFactory 来获取 Shape 对象。 以便获取它所需对象的类型。
从这张图我们可以看出来 Circle(圆形), Square(方形) ,Rectangle(矩形) 这 三个类都继承了Shape(形状)接口 而 这些类都交给ShapeFactory类来管理
我们使用FactorypattemDemo类来测试 访问ShapeFactory形状工厂 获取想要的 形状对象
接口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.
抽象工厂
从上面案例中我们可以发现 工厂模式是 挺好用的 但是会暴露一个问题就是 随着业务的增多 那么工厂也对应增多 造成了难以管理
如何解决这个问题呢 ? 可以使用 抽象工厂来管理所有的工厂
从这张图我们可以看出来有 2个工厂 一个是形状工厂 一个是颜色工厂 而这些工厂 都交给了 AbstractFactory这个大抽象工厂来管理
既然是抽象工厂 我们需要子类FactoryProducer(工厂生产)来实现 然后通过AbstractFactoryPatternDemo 测试类来 访问FactoryProducer 生产我们需要的工厂(形状工厂或者颜色工厂) 然后在通过对应的工厂生产指定的对象
抽象工厂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工厂模式分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6226.html