Java设计模式之创建型模式

一、创建型模式

1、工厂模式【Factory

定义:工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

普通工厂:工厂是具体的,产品是抽象的。【学习难度:★★☆☆☆,使用频率:★★★★★

 

抽象工厂:工厂是抽象的,产品是抽象的。【学习难度:★★★★☆,使用频率:★★★★★

 

对比工厂模式和抽象工厂模式:

1.工厂模式对产品Product进行了抽象,通过传递ProductType进行动态构造Product

【比较常用】

2.抽象工厂在工厂模式上,又对工厂进行了抽象,抽象了工厂制造提供产品的行为,这样就可以动态设置不同的工厂,生产多种不同品类的产品。

【剥离工厂与产品之前的耦合,便于扩展】


 

2、单例模式【Singleton【学习难度:★☆☆☆☆,使用频率:★★★★☆

定义:通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

单例模式应该说是最常见的一种设计模式了。

 

主要优点:

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

3、有些类如打印机,全局只需要一个或者一种打印机的。

 

主要缺点:

1、由于单利模式中没有抽象层,耦合性太强,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了单一职责原则

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

 

因此,在使用单例之前,一定要三思而后行。

 

3、建造者模式【Builder【学习难度:★★★★☆,使用频率:★★☆☆☆

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 

构建者类似工厂模式,但是区别在于:建造者模式注重零部件的组装过程【具体的创建在产品内部创建】,而工厂方法模式更注重零部件的创建过程。

 

使用建造者模式的好处:

1.使用建造者模式可以使客户端不必知道产品内部组成的细节(不需要非常多的构造函数)

2.具体的建造者类之间是相互独立的,对系统的扩展非常有利。

3.由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。

使用建造模式的场合:

1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

2.要创建的复杂对象的算法,独立于该对象的组成部分,也独立于组成部分的装配方法时。


 

4、原型模式【Prototype【学习难度:★★★☆☆,使用频率:★★★☆☆

定义:该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。

使用场景:

1)在进行网络请求的时候,一些全局性的配置,例如:baseUrltimeoutretryCountcacheModeInterceptor等,我们不希望每次进行网络请求的时候都进行设置,就可以将这些配置存放在一个单例中,每次创建网络请求的时候,在构造方法里先复制拷贝这些全局属性,然后在网络请求里面提供动态设置这些属性的方法,这样就可以省去很多设置操作,从而实现全局配置,动态变化。

2)在JS里面,对象的继承就是使用原型模式实现的(没有extends),ES6之后才引入了extends

 

 想了解更多内容,点击java设计模式学习资料下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的创建型设计模式有以下几种: 1. 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式使一个类的实例化延迟到其子类。 2. 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 3. 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点。 4. 建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 5. 原型模式(Prototype Pattern):用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。 以下是一个工厂方法模式的示例: ```java // 定义一个抽象的工厂类 abstract class AbstractFactory { public abstract Shape getShape(String shapeType); } // 定义一个工厂类,用于创建不同的形状 class ShapeFactory extends AbstractFactory { 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; } } // 定义一个接口,用于表示不同的形状 interface Shape { void draw(); } // 定义一个圆形类 class Circle implements Shape { public void draw() { System.out.println("Inside Circle::draw() method."); } } // 定义一个矩形类 class Rectangle implements Shape { public void draw() { System.out.println("Inside Rectangle::draw() method."); } } // 定义一个正方形类 class Square implements Shape { public void draw() { System.out.println("Inside Square::draw() method."); } } // 使用工厂类创建不同的形状 public class FactoryPatternDemo { public static void main(String[] args) { AbstractFactory shapeFactory = new ShapeFactory(); Shape shape1 = shapeFactory.getShape("CIRCLE"); shape1.draw(); Shape shape2 = shapeFactory.getShape("RECTANGLE"); shape2.draw(); Shape shape3 = shapeFactory.getShape("SQUARE"); shape3.draw(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuexiangjys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值