设计模式

设计模式是前人总结的,为了解决一类问题而总结的代码设计经验。

最初可能为了使用而使用,后面就会发现。非常多没想到的问题由于使用了正确的设计模式已经为你考虑到了。《design patterns设计模式》这本书是程序猿进阶必学。

(一)工厂模式  

工厂模式的意义在于定义一个用于创建对象的接口,并控制返回哪个类的实例。网上比較流行的一个普通工厂模式的样例。

interface Sender{
public void send();
}
class MainSender implements Sender{
public void send (){
System.out.println("MainSender");
}
}
class SnsSender implements Sender{
public void send(){
System.out.println("SnsSender");
}
}
class SendFactory{
public Sender product(String type){
if("Main".equals(type)){
return new MainSender();
}else if("Sns".equals(type)){
return new SnsSender();
}else{
System.out.println("请输入正确类型");
return null;
}
}
}
public class Factory {
public static void main(String[] args){
SendFactory factory = new SendFactory();
Sender sender = factory.product("Main");
sender.send();
}
}

可是个人感觉这个没啥用处。

在《java设计模式》中对于工厂模式的定义感觉比較好,工厂模式使得client代码无须关心使用哪个类的实例,可是上面的样例须要调用者决定返回哪个类的实例。工厂模式不仅要求有一个可以创建新对象的方法,还要让客户代码无须了解详细实例化的类。返回的同样的抽象类型,但实际实例化了不同的类,由哪个类实例化取决于工厂对象接收创建请求时的行为。

所以我的理解是,工厂模式的意图是让服务的提供者确定实例化哪个类。而不是客户代码。改动下上面的代码。

interface Sender{
public void send();
}
class MainSender implements Sender{
public void send (){
System.out.println("MainSender");
}
}
class SnsSender implements Sender{
public void send(){
System.out.println("SnsSender");
}
}
class SendFactory{
public int day = 0;
public SendFactory(){
day = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
}
public Sender product(){
if(day%2 == 0){
return new MainSender();
}else{
return new SnsSender();
}
}
}
public class Factory {
public static void main(String[] args){
SendFactory factory = new SendFactory();
Sender sender = factory.product();
sender.send();
}
}

(二)抽象工厂模式

抽象工厂相比于上面的工厂模式。多了一个抽象接口就是,上面的工厂类是无法扩展的,假设要扩展必须改动工厂类。违背闭包原则。

假设将工厂也抽象出来就是一个抽象工厂模式,须要扩展时候直接扩展一个新的工厂。

长处:1、封装性好,产品实现类高层模块不关系。仅仅要找到合适的工厂类。

2、产品族内约束为非公开。

缺点:扩展困难,加入一个新工厂。并且新工厂须要一个新接口,那么须要改动抽象类接口。并且前面的每一个工厂也要对应的改动。

所以对于抽象工厂模式横向扩展简单,纵向扩展困难。

在使用的时候可以注意。

interface Sender{
public void send();
}
interface Provider{
public Sender product();
}
class MainSender implements Sender{
public void send (){
System.out.println("MainSender");
}
}
class SnsSender implements Sender{
public void send(){
System.out.println("SnsSender");
}
}
class SendMainFactory implements Provider{
public int day = 0;
public SendMainFactory(){
day = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
}
public Sender product(){
if(day%2 == 0){
return new MainSender();
}
return null;
}
}
class SendSnsFactory implements Provider{
public int day = 0;
public SendSnsFactory(){
day = Calendar.getInstance().get(Calendar.DAY_OF_YEAR);
}
public Sender product(){
if(day%2 == 0){
return new SnsSender();
}
return null;
}
}
public class Factory {
public static void main(String[] args){
Provider factory = new SendSnsFactory();
Sender sender = factory.product();
sender.send();
}
}

上面的样例,假设添加一个新工厂仅仅要新建一个工厂继承Provider 。扩展非常easy。可是假设须要添加Provider的接口。那么

SendMainFactory
SendSnsFactory

也要对应改动。

Java设计模式(一)普通工场模式 抽象工场模式的更多相关文章

  1. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  2. Java设计模式—工厂方法模式&抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  3. Java 设计模式系列(二十)状态模式

    Java 设计模式系列(二十)状态模式 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改 ...

  4. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  5. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  6. Java 设计模式系列(十七)中介者模式

    Java 设计模式系列(十七)中介者模式 用一个中介对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互 一.中介者模式结构 Media ...

  7. Java 设计模式系列(八)装饰者模式

    Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...

  8. 深入探索Java设计模式(三)之装饰器模式

    装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...

  9. Java设计模式(20)观察者模式(Observer模式)

    Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循 ...

  10. Java设计模式(9)适配器模式(Adapter模式)

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用 ...

随机推荐

  1. Scala学习笔记——内建控制结构

    Scala的内建控制结构包括:if.while.for.try.match和函数调用 1.if表达式 //常见的写法 var filename = "name" if (!args ...

  2. Angular4学习笔记(五)- 数据绑定、响应式编程和管道

    概念 Angular中的数据绑定指的是同一组件中控制器文件(.ts)与视图文件(.html)之间的数据传递. 分类 流向 单向绑定 它的意思是要么是ts文件为html文件赋值,要么相反. ts-> ...

  3. 多线程开发之一 NSThread

    每个 iOS 应用程序都有个专门用来更新显示 UI 界面.处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来不好的用户体验. 一般的解决 ...

  4. [IR] Advanced XML Compression - XBW

    思考:与ISX对比后能得出什么结论 原理解析: We proposed the XBW-transform that mimics on trees the nice structural prope ...

  5. 【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...

  6. linux相关(3)

    1. shell环境变量 能够存在于本shell进程及其子shell进程的变量.变量可以从父shell进程传递给子shell进程,而不能反过来,因此环境变量在子shell进程中无论如何修改都不会影响到 ...

  7. 解决在html中引入font-awesome的css文件后, 图标显示不出来

    今天小颖在做项目时,需要在html文件中引入font-awesome.min.css,但是引入后: 以前小颖在用font-awesome库里的图标时,都是直接从node中下包,然后在main.js中引 ...

  8. linux远程安装和使用

    Putty:一个Telnet.SSH.rlogin.纯TCP以及串行接口连接软件,体积小.完全免费.使用方便快捷,基本的功能都有.有点不好的地方:在一界面上一次只能打开一个窗口,对于快速查看和操作不太 ...

  9. nodejs的koa2框架

    官网文档 cnpm i --save-dev koa2 koa-router koa-body koa-static request npm install --save koa2 const koa ...

  10. pycharm更新之后显示问题

    pycharm更新之后显示问题 在新版pycharm中等号和其他符号会连在一块,下面是解决方法 添加公众号: