这是一种创建对象的设计模式。诞生它的初衷之一,是因为设计出了多个子类,导致这些类的使用者调用起来不是很便捷,于是他们对开发这些类的作者提出需求,需要增加一个对象工厂类来管理子类,由对象工厂组装出不同的子类对象。
这样,使用者只需找到对象工厂类,调用它创建出工厂里的任意一个对象。
大家注意:设计模式与具体的实现语言无关,它是一种提高面向对象可复用性、可扩展性的设计思想。一般来讲,设计模式普遍使用的语言包括:Java、C#、Python等。
此处是讲设计模式,简化语言实现,重点帮助大家理解设计模式,因此不要纠结语法,你可以理解为下面是伪代码
需要更多大厂面试资料的话也可以点击直接进入,免费获取!暗号:CSDN
首先定义一个接口:
class Interface(object):
def createCar():
pass
如下定义 3 个实现接口的类:
class A(Interface):
def createCar():
print('A-method')
class B(Interface):
def createCar():
print('B-method')
class C(Interface):
def createCar():
print('C-method')
创建一个对象工厂,专门用于创建A或B或C:
class CarFactory(object):
def getObject(methodStr):
if methodStr == 'A':
return A() # 返回A对象
if methodStr == 'B':
return B()
if methodStr == 'C':
return C()
使用时,通过 CarFactory().getObject(‘C’) 得到C对象,调用C对象的方法createCar就能根据此方法造车。
学习设计模式的最终目标是要用到实际开发中,要灵活运用,要养成一种使用直觉。上版对象工厂实现,大家对其有何预期?
首先来看,如果将来生成Car又增加一种D方法,于是乎,需要增加下面的代码:
新增一个类D,这是没有问题的,符合面向对象的可扩展性:
class D(Interface):
def createCar():
print('D-method')
但是对象工厂CarFactory这个模块就要修改内部的方法getObject,增加一条生成D对象的分支。但这确实破坏了类的封装!
为解决此问题,实际上还可以进一步抽象,进一步扩展出几个类。比如增加一个抽象工厂类:
class CarFactoryInterface(object):
pass
重新创建一个实现接口的工厂类:CarFactoryExtend,从而不用修改用来的类文件。
class CarFactoryExtend(CarFactoryInterface):
def getObject(methodStr):
if methodStr == 'A':
return A() # 返回A对象
if methodStr == 'B':
return B()
if methodStr == 'C':
return C()
if methodStr == 'D':
return D()
以上设计模式就是所谓的抽象工厂模式。你看,这些设计模式的形成都是由需求背景的。因此,不是先有设计模式后,开发者们循着设计模式去解决实际需求;而恰恰相反,是有了源源不断的开发需求后,日积月累沉淀下这十几种实际模式。并被后来的开发者们争相模仿学习,更是被领悟其思想精髓者,大呼其好用。
设计模式的几个禁忌,大概总结为以下几点:
-
不是越抽象越好,也不是不抽象,而是要把握好一个度;
-
继承链条的根不要是具体的实现类,因为具体不等于抽象,根最好是接口或抽象类;
-
不要生搬硬套各种设计模式,虽然每个模式都有一个标准版本,但日常使用一般不是死板的模仿,一个角色都不能少;
-
设计模式不是无用的,如果喜欢总结,再工作几年后,脑子里会有几个常用设计模式;
- 没有一个通用的设计模式,一个设计模式往往只针对某个特定场景。
有一种设计模式常被用于算法开发,先不说它的名字,我们根据实际的需求场景,倒推出这个设计模式。
解决某个特定问题可以使用策略A类里的方法solve:
class A(object):
def solver():
print('A method')
后来又发明方法B类:
class B(object):
def solver():
print('B method')
设计模式最重要一条:继承链条的根要是抽象类或接口,因此提取出接口StrategyInterface:
class StrategyInterface(object):
# 完结
Redis**基于内存**,常用作于**缓存**的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。
Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

**感兴趣的朋友可以通过[点赞+戳这里的方式免费获取](https://gitee.com/vip204888/java-p7)腾讯专家手写Redis源码日志笔记pdf版本!**
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/123167.html