工厂模式(Factory Pattern)
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。创建过程在其子类执行。
优点: 1、一个调用者想创建一个对象,要知道其名称。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口,对内部实现产生保护,提升安全性。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

抽象工厂模式(Abstract Factory Pattern)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在一个工厂里聚合多个同类产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
示例

public interface Shape {void draw();
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}public interface Color {void fill();
}public class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}
}public class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}
}public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape) ;
}public class ShapeFactory extends AbstractFactory {@Overridepublic 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;}@Overridepublic Color getColor(String color) {return null;}
}public class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@Overridepublic Color getColor(String color) {if(color == null){return null;}        if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} return null;}//创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
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;}
}public class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");//获取形状为 Circle 的对象Shape shape1 = shapeFactory.getShape("CIRCLE");//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 = shapeFactory.getShape("RECTANGLE");//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3 = shapeFactory.getShape("SQUARE");//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");//获取颜色为 Red 的对象Color color1 = colorFactory.getColor("RED");//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2 = colorFactory.getColor("Green");//调用 Green 的 fill 方法color2.fill();}
}

适配器模式(Adapter Pattern)
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

public class MediaAdapter implements MediaPlayer {AdvancedMediaPlayer advancedMusicPlayer;public MediaAdapter(String audioType){if(audioType.equalsIgnoreCase("vlc") ){advancedMusicPlayer = new VlcPlayer();       } else if (audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer = new Mp4Player();}  }@Overridepublic void play(String audioType, String fileName) {if(audioType.equalsIgnoreCase("vlc")){advancedMusicPlayer.playVlc(fileName);}else if(audioType.equalsIgnoreCase("mp4")){advancedMusicPlayer.playMp4(fileName);}}
}

装饰器模式(Decorator Pattern)
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。
作用 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

public interface Shape {void draw();
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Shape: Rectangle");}
}public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape){this.decoratedShape = decoratedShape;}public void draw(){decoratedShape.draw();}
}public class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape);     }@Overridepublic void draw() {decoratedShape.draw();         setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape){System.out.println("Border Color: Red");}
}

代理模式(Proxy Pattern)
为其他对象提供一种代理以控制对这个对象的访问。
在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因,直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。 2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。


public class RealImage implements Image {private String fileName;public RealImage(String fileName){this.fileName = fileName;loadFromDisk(fileName);}@Overridepublic void display() {System.out.println("Displaying " + fileName);}private void loadFromDisk(String fileName){System.out.println("Loading " + fileName);}
}public class ProxyImage implements Image{private RealImage realImage;private String fileName;public ProxyImage(String fileName){this.fileName = fileName;}@Overridepublic void display() {if(realImage == null){realImage = new RealImage(fileName);}realImage.display();}
}

迭代器模式(Iterator Pattern)
提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。


public interface Iterator {public boolean hasNext();public Object next();
}public interface Container {public Iterator getIterator();
}public class NameRepository implements Container {public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};@Overridepublic Iterator getIterator() {return new NameIterator();}private class NameIterator implements Iterator {int index;@Overridepublic boolean hasNext() {if(index < names.length){return true;}return false;}@Overridepublic Object next() {if(this.hasNext()){return names[index++];}return null;}     }
}

备忘录模式(Memento Pattern)
捕获一个对象的内部状态,并在该对象之外保存这个状态。确保不破坏封装性的前提下。
1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。 2、实现了信息的封装,使得用户不需要关心状态的保存细节。 需要保存/恢复数据的相关状态场景, 提供一个可回滚的操作。

public class Memento {private String state;public Memento(String state){this.state = state;}public String getState(){return state;}
}public class Originator {private String state;public void setState(String state){this.state = state;}public String getState(){return state;}public Memento saveStateToMemento(){return new Memento(state);}public void getStateFromMemento(Memento Memento){state = Memento.getState();}
}
public class CareTaker {private List<Memento> mementoList = new ArrayList<Memento>();public void add(Memento state){mementoList.add(state);}public Memento get(int index){return mementoList.get(index);}
}

观察者模式(Observer Pattern)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制

状态模式(State Pattern)
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。

策略模式(Strategy Pattern)
一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。一个系统有许多许多类,而区分它们的只是他们直接的行为。将这些算法封装成一个一个的类,任意地替换。1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。


public interface Strategy {public int doOperation(int num1, int num2);
}public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}public class OperationSubtract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}

模板模式(Template Pattern)
一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
一些方法通用,却在每一个子类都重新写了这一方法。有一些通用的方法。将这些通用算法抽象出来。

访问者模式(Visitor Pattern)
将数据结构与数据操作分离。需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。
1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。
注意事项:访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。


public interface ComputerPart {public void accept(ComputerPartVisitor computerPartVisitor);
}public class Keyboard  implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}public class Monitor  implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}public class Computer implements ComputerPart {ComputerPart[] parts;public Computer(){parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      } public class Mouse  implements ComputerPart {@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {computerPartVisitor.visit(this);}
}@Overridepublic void accept(ComputerPartVisitor computerPartVisitor) {for (int i = 0; i < parts.length; i++) {parts[i].accept(computerPartVisitor);}computerPartVisitor.visit(this);}
}public interface ComputerPartVisitor {public void visit(Computer computer);public void visit(Mouse mouse);public void visit(Keyboard keyboard);public void visit(Monitor monitor);
}public class ComputerPartDisplayVisitor implements ComputerPartVisitor {@Overridepublic void visit(Computer computer) {System.out.println("Displaying Computer.");}@Overridepublic void visit(Mouse mouse) {System.out.println("Displaying Mouse.");}@Overridepublic void visit(Keyboard keyboard) {System.out.println("Displaying Keyboard.");}@Overridepublic void visit(Monitor monitor) {System.out.println("Displaying Monitor.");}
}public class VisitorPatternDemo {public static void main(String[] args) {ComputerPart computer = new Computer();computer.accept(new ComputerPartDisplayVisitor());}
}

几种软件设计模式简述以及示例相关推荐

  1. 单片机 10种软件滤波方法的示例程序

    单片机学习笔记_10种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整     v ...

  2. 一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一.设计模式是什么? 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想.同一场景有多 ...

  3. 几种常用设计模式的简单示例

    前言 模式是在某一背景下某个问题的一种解决方案. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 为了保证代码的可靠性.提高代码的复用率. ...

  4. 软件设计模式从何而来?------“抄袭来的” 设计模式

    博主:爱码叔 个人博客站点: icodebook 公众号:漫话软件设计 专注于软件设计与架构.技术管理.擅长用通俗易懂的语言讲解技术.对技术管理工作有自己的一定见解.文章会第一时间首发在个站上,欢迎大 ...

  5. 【Spring】JavaBean、MVC软件设计模式与Java中Dao、Service、Controll三层体系

    文章目录 一.JavaBean 二.Java三层体系 1.Dao层 2.Service层 3.Controller层 三者之间的关系 三.MVC设计模式 1.模型 2.视图 3.控制器 三者之间的关系 ...

  6. 软件设计模式-7种设计原则总结

    7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同.其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭:里氏替换原则告诉我们不要破坏继承体系:依赖倒置原则告诉我们要面向接口 ...

  7. 23种设计模式——软件设计模式概述

    文章目录 23种设计模式--软件设计模式概述 1.软件设计模式的产生背景 2.软件设计模式的概念与意义 2.1. 软件设计模式的概念 2.2. 学习设计模式的意义 3.软件设计模式的基本要素 4.23 ...

  8. C++常用的11种设计模式解释及示例

    c++常用的设计模式包括单例模式.工厂模式.抽象工厂模式.适配器模式.装饰者模式.代理模式.外观模式.桥接模式.组合模式.享元模式.观察者模式和命令模式等.使用设计模式的好处:提高代码的可读性和可维护 ...

  9. 软件设计模式:三个类别,23种方法

    软件设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证 ...

最新文章

  1. 回望2018,展望2019
  2. 行为模式之Memento模式
  3. CCF-CSP 201612-2 工资计算(C++满分代码)
  4. swagger python自动化用例_如何让Swaggergenerated Python客户机正常工作?
  5. SpringBoot+Redis(实现处理热点数据)
  6. 从分布式锁角度理解Java的synchronized关键字
  7. gt爵士变形步骤_编码广播:编码时您可以听24/7爵士节奏
  8. springboot整合富文本编辑器
  9. Windows 解决端口占用
  10. 实战:大数据营销 微信朋友圈广告
  11. 如平静的水面,波澜不惊
  12. 还原精灵的另类卸载方法
  13. html调用手机NFC,如何使用手机上NFC的功能
  14. 使用Python读取和处理安卓传感器数据与CSV读取
  15. 程序员如何摆脱平庸?
  16. 基于JAVA早教课程管理系统计算机毕业设计源码+系统+数据库+lw文档+部署
  17. 中软国际和华为签署电信业务云合作协议
  18. PostgreSQL修炼之道:从小工到专家. 导读
  19. echart水滴_漂亮得不像实力派:ECharts 水球图教程
  20. 【连续介质力学】粘性、弹性和塑性的区别,非牛顿流体

热门文章

  1. Hi3516全系统类型烧录教程
  2. java项目如何判断一个请求是否为AJAX请求
  3. iptables配置SNAT实现共享上网
  4. Android中 .stub类的使用
  5. OCR 图像智能字符识别技术
  6. Excel VBA:设置单元格边框
  7. windows下,对opencv进行gcc/g++编译
  8. 输出字符的ascii码
  9. 词向量系列之One-Hot编码详解
  10. (C++/python)LeetCode 589. N叉树的前序遍历