设计模式

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

最初可能为了使用而使用,后面就会发现。非常多没想到的问题由于使用了正确的设计模式已经为你考虑到了。《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. MySQL高性能优化系列

    https://www.cnblogs.com/huchong/p/10219318.html https://www.cnblogs.com/huchong/tag/MySQL%E9%AB%98%E ...

  2. [Python]编程之美

    Task 1 : 首字母大写 import re #python 正则表达式包:re s='hello world' s=re.sub(r"\w+",lambda match:ma ...

  3. 十三、K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》

    0.存储过程开头变量定义 ), --单据起始日期 ), --单据截止日期. ), ), ), ), ) @FType varchar(50),  --单据类型@FBillNo varchar(50), ...

  4. 【CF582E】Boolean Function 树形DP+FWT

    [CF582E]Boolean Function 题意:给你一个长度为n的表达式,其中未知数有A,B,C,D和?,运算有&和|和?(表达式中用括号确定了唯一的运算顺序).?代表A,B,C,D或 ...

  5. SecureCRT安装使用

    ● 解决自动断开 echo "TMOUT=6000 " >>/etc/profile source /etc/profile 在连接上右键属性,然后“终端”,“反空闲” ...

  6. ML.NET教程之出租车车费预测(回归问题)

    理解问题 出租车的车费不仅与距离有关,还涉及乘客数量,是否使用信用卡等因素(这是的出租车是指纽约市的).所以并不是一个简单的一元方程问题. 准备数据 建立一控制台应用程序工程,新建Data文件夹,在其 ...

  7. 终于知道什么情况下需要实现.NET Core中的IOptions接口

    自从接触 IOptions 之后,一直纠结这样的问题:自己定义的 Options 要不要实现 IOptions 接口. 微软有的项目中实现了,比如 Caching 中的 MemoryCacheOpti ...

  8. update set from 语句用法

    关键字: update set from 下面是这样一个例子: 两个表a.b,想使b中的memo字段值等于a表中对应id的name值     表a:id, name               1   ...

  9. Python:time模块、calendar模块

    time模块 import time 获取时间戳 >>>time.time() #1532418950.7246091 获取时间元组 >>> time.localt ...

  10. linux文件系统扩展属性

    翻译自man手册,水平有限,有错还望不吝指出.... 扩展属性是与文件和目录相关的name:value对,用来提供文件系统的一些附加功能,例如ACL.对文件或是目录拥有读权限的用户可以看到其扩展属性. ...