设计模式

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

最初可能为了使用而使用,后面就会发现。非常多没想到的问题由于使用了正确的设计模式已经为你考虑到了。《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. session一直报错Session store not set on request

    Route::group(['middleware' => ['web']], function () { //});仍然报错,看了 session是使用默认file,没问题:app/stora ...

  2. Ubuntu 14.04 配置VNC服务 配置Xfce4桌面

    一.安装配置VNC 1.首先安装VNC apt-get install vnc4server 2.为VNC设置密码 vncpasswd 输入密码,然后再确认一遍,就OK了. 3.启动VNC vncse ...

  3. HTML 选择目录

    <input type="file" webkitdirectory directory multiple/>

  4. WebApi中的Session与Token间的处理对接

    首先,说起来创建session,一般会针对注册登录或者授权等情况: session 从字面上讲,就是会话.这个就类似于你和一个人交谈,你怎么知道当前和你交谈的是张三而不是李四呢?对方肯定有某种特征(长 ...

  5. 解决在antd中使用 autoprefixer 9.4.5 会抛出错误 Replace text-decoration-skip: ink to text-decoration-skip-ink: auto, because spec had been changed 的问题

    其实这个和antd的版本有关系,只需要把antd的版本升级到3.12.4就可以了 yarn add antd@ --save 记得重新运行一下项目

  6. Qt编写自定义控件1-汽车仪表盘

    前言 汽车仪表盘几乎是qt写仪表盘控件中最常见的,一般来说先要求美工做好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图基本 ...

  7. 【CF553E】Kyoya and Train 最短路+cdq分治+FFT

    [CF553E]Kyoya and Train 题意:有一张$n$个点到$m$条边的有向图,经过第i条边要花$c_i$元钱,经过第i条边有$p_{i,k}$的概率要耗时k分钟.你想从1走到n,但是如果 ...

  8. celery 原理理解

    这里有一篇写的不错的:http://www.jianshu.com/p/1840035cb510 自己的“格式化”后的内容备忘下: 我们总在说c10k的问题, 也做了不少优化, 然后优化总是不够的. ...

  9. elasticsearch.yml配置文件

        Elasticsearch的配置文件在config文件夹下,其中有elasticsearch.yml.logging.yml两个配置文件,其中elasticsearch.yml是用来配置Ela ...

  10. 170830、oracle密码过期ORA-28002: 7天之后口令将过期的解决方法

    登陆oracle数据库时错误信息提示:“ORA-28002: 7 天之后口令将过期”. 原因:oracle11g中默认在default概要文件中设置了"PASSWORD_LIFE_TIME= ...