ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

简单聊聊工厂模式

2022-01-27 00:00:54  阅读:160  来源: 互联网

标签:draw 创建 模式 工厂 聊聊 方法 public


设计模式的分类:

设计模式总体分为三大类:

创建型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。

结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。

行为型模式:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介模式,解释器模式。

工厂模式:

工厂模式属于创建型模式,顾名思义就是将零件组装成产品的地方,也就是创建对象的工厂。

通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法。调用者使用某些参数调用此方法之后,工厂会根据参数创建所需类型的对象,然后将它们返回给调用者。

当我们明确地计划不同条件下创建不同实例时,就可以使用该设计模式

它具有那些优点呢,最大的就是松耦合,即对象的创建可以独立于类的实现,用户不需要了解创建对象的类,但是依然可以使用它来创建对象,它只需要知道需要传递的接口、方法和参数,就能够创建 所需类型的对象了,

Factory模式又分为简单工厂模式,工厂方法模式和抽象工厂模式,下面就具体的看一看他们的区别把

1.简单工厂模式

概念:允许接口创建对象,但不会暴露对象的创建逻辑,他和工厂方法模式类似,这里就不多赘述了

简单工厂有一个问题就是,对象的创建依赖于工厂类,这样想要扩展程序,必须对工厂类进行修改,违背了开闭原则(开闭原则就是对扩展开放,对修改关闭),所以,从设计的角度思考,这样的问题该如何解决呢?我们可以定义一个创建对象的抽象方法并创建多个不同的工厂类实现该抽象方法,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。这种方法也就是我们接下来要说的工厂方法模式。

2.工厂方法模式

概念:定义了一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推给了子类。
1.创建一个接口

	public interface Shape {
  	 void draw();
	}

2.创建接口的实现类

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

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

3.创建一个工厂,生成基于给定的信息的实体类对象

public class ShapeFactory {
    
   //使用 getShape 方法获取形状类型的对象
   public Shape getShape(String shapeType){
      if(shapeType == null){
         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;
   }
}

4.使用该工厂,通过传递参数信息来获取实体类对象

public class FactoryPatternDemo {
 
   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();
 
      //获取 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.

这个模式的好处就是,如果你现在想增加一个功能,只需做一个实现类就OK了,无需去改动现成的代码。这样做,拓展性较好!但是每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

3.抽象工厂模式

抽象工厂模式的主要目的是提供一个接口来创建一系列相关对象,而无需指定具体的类。工厂方法将创建实例的任务委托给了子类,而抽象工厂方法的目标是创建一系列相关对象。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:draw,创建,模式,工厂,聊聊,方法,public
来源: https://blog.csdn.net/hdushsh/article/details/122710287

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有