一 设计模式创建型模式( 四 )


::draw() .
::draw() .
Red::fill() .
Green::fill() .
Blue::fill() .
后记
下面例子中鼠标,键盘,耳麦为产品,惠普,戴尔为工厂 。
简单工厂模式
简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类 。
比如下图中的鼠标工厂,专业生产鼠标,给参数 0,生产戴尔鼠标,给参数 1,生产惠普鼠标 。
工厂模式
工厂模式也就是鼠标工厂是个父类,有生产鼠标这个接口 。
戴尔鼠标工厂,惠普鼠标工厂继承它,可以分别生产戴尔鼠标,惠普鼠标 。
生产哪种鼠标不再由参数决定,而是创建鼠标工厂时,由戴尔鼠标工厂创建 。
后续直接调用鼠标工厂.生产鼠标()即可
抽象工厂模式
抽象工厂模式也就是不仅生产鼠标,同时生产键盘 。
也就是 PC 厂商是个父类,有生产鼠标,生产键盘两个接口 。
戴尔工厂,惠普工厂继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘 。
创建工厂时,由戴尔工厂创建 。
后续工厂.生产鼠标()则生产戴尔鼠标,工厂.生产键盘()则生产戴尔键盘 。
在抽象工厂模式中,假设我们需要增加一个工厂
假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商 。
之后创建华硕鼠标,继承鼠标类 。创建华硕键盘,继承键盘类即可 。
在抽象工厂模式中,假设我们需要增加一个产品
假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类 。
之后在PC厂商这个父类中,增加生产耳麦的接口 。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能 。以上 。
单例模式
单例模式( )是 Java 中最简单的设计模式之一 。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式 。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建 。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象 。
注意:
介绍
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点 。
主要解决:一个全局使用的类频繁地创建与销毁 。
何时使用:当您想控制实例数目,节省系统资源的时候 。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建 。
关键代码:构造函数是私有的 。
应用实例:1、一个党只能有一个主席 。2、 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行 。3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件 。
优点:1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存) 。2、避免对资源的多重占用(比如写文件操作) 。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化 。
使用场景:1、要求生产唯一序列号 。2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来 。3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等 。
注意事项:() 方法中需要使用同步锁(.class) 防止多线程同时进入造成被多次实例化 。