1. 单例模式(一个类只有一个实例)

package ch.test.notes.designmodel;

/**
* Description: 单例模式 (饿汉模式 线程安全的)
*
* @author cy
* @date 2019年05月10日 9:33
* version 1.0
*/
public class Singelon { private static Singelon si = new Singelon(); public static Singelon getInstance() {
return si;
} private Singelon() { // 将构造方法封装为私有化
} public void print(){
System.out.println("打印--------->");
}
}
package ch.test.notes.designmodel;

/**
* Description: 单例模式 (懒汉模式)线程不安全
*
* @author cy
* @date 2019年05月10日 9:33
* version 1.0
*/
public class Singelon { private static Singelon si = null; private Singelon() { // 将构造方法封装为私有化
} public static Singelon getInstance() {
if(si == null){
si = new Singelon();
}
return si;
} public void print(){
System.out.println("打印--------->");
}
}

  2. 工厂模式(多个子类实现一个接口,根据不同子类复写父类方法,根据业务产生不同的实例)

package ch.test.notes.designmodel;

/**
* Description:定义一个人的接口
*
* @author cy
* @date 2019年05月10日 9:50
* version 1.0
*/
public interface Person1 { // 人的身高
String getHeight(); // 职位
String getWork(); }

创建两个实现类

package ch.test.notes.designmodel;

/**
* Description: 实现类
*
* @author cy
* @date 2019年05月10日 9:52
* version 1.0
*/
public class Student implements Person1 { @Override
public String getHeight() {
return "";
} @Override
public String getWork() {
return "我的职位是学生!";
}
}
package ch.test.notes.designmodel;

/**
* Description:实现类
*
* @author cy
* @date 2019年05月10日 9:53
* version 1.0
*/
public class Tearch implements Person1 { @Override
public String getHeight() {
return "";
} @Override
public String getWork() {
return "我的职位是教师!";
}
}

创建一个工厂,根据类型不同创建不同的对象

package ch.test.notes.designmodel;

/**
* Description: 人员工厂
*
* @author cy
* @date 2019年05月10日 9:55
* version 1.0
*/
public class Factory { public static Person1 getInstance(String type){
Person1 person = null;
if("".equals(type)){
person = new Student();
}else {
person = new Tearch();
}
return person;
}
}

测试(传入不同的类型,得到不同的对象内容)

package ch.test.notes.designmodel;

/**
* Description: // 设计模式
*
* @author cy
* @date 2019年05月10日 9:16
* version 1.0
*/
public class main { public static void main(String[] args) {
Person1 instance = Factory.getInstance("");
String work = instance.getWork();
System.out.println(work); } }

3. 代理模式 (由一个主题来操作一个真实主题,代理服务器来完成一个真实业务以外的业务)

  角色(要做的东西,    假设只有vip 能做, 代理就是vip   普通人员不是,所以需要代理人代理)

package ch.test.notes.designmodel;

/**
* Description: 商店
*
* @author cy
* @date 2019年05月10日 10:32
* version 1.0
*/
public interface Store { // 买东西
String getGoods(boolean vip); }
package ch.test.notes.designmodel;

/**
* Description:
*
* @author cy
* @date 2019年05月10日 10:35
* version 1.0
*/
public class StoreImpl implements Store { private int num = ; @Override
public String getGoods(boolean vip) {
if(!vip){
System.out.println("只有VIP才能购买商品!");
return "只有VIP才能购买商品!";
}
num --;
System.out.println("购买了货物,剩余数量为"+ num);
return "购买了货物,剩余数量为"+ num;
}
}
package ch.test.notes.designmodel;

/**
* Description: 代理
*
* @author cy
* @date 2019年05月10日 10:34
* version 1.0
*/
public class Proxy{ private Store store;
private Boolean vip = true; public Proxy(Store store){
this.store = store;
} // 购买商品
public String getGoods() {
// 这里也可以做一些校验
// 检查身份证
return store.getGoods(this.vip);
}
}
package ch.test.notes.designmodel;

/**
* Description: // 设计模式
*
* @author cy
* @date 2019年05月10日 9:16
* version 1.0
*/
public class main { public static void main(String[] args) {
StoreImpl store = new StoreImpl();
store.getGoods(false);
new Proxy(store).getGoods();
} }

结果:

只有VIP才能购买商品!
购买了货物,剩余数量为9

  4. 委派模式(相当于领导给项目经理下达任务,项目经理将不同的任务,下达到不同的人上面,和上面的区别是注重的是结果,不需要过程)

    (角色 做任务    员工A  员工B  组长         组长接到任务后,分配给A和B)

package ch.test.notes.designmodel;

/**
* Description: 老板需要做的任务
*
* @author cy
* @date 2019年05月10日 11:08
* version 1.0
*/
public interface ITarget { public void doSomething(String command);
}
package ch.test.notes.designmodel;

/**
* Description:
*
* @author cy
* @date 2019年05月10日 11:10
* version 1.0
*/
public class TargetA implements ITarget{ @Override
public void doSomething(String command) {
System.out.println("我是员工A,开始做"+command+"工作");
}
}
package ch.test.notes.designmodel;

/**
* Description:
*
* @author cy
* @date 2019年05月10日 11:10
* version 1.0
*/
public class TargetB implements ITarget{ @Override
public void doSomething(String command) {
System.out.println("我是员工B,开始做"+command+"工作");
}
}
package ch.test.notes.designmodel;

import java.util.HashMap;
import java.util.Map; /**
* Description: 组长
*
* @author cy
* @date 2019年05月10日 11:11
* version 1.0
*/
public class Leader implements ITarget { private Map<String,ITarget> map = new HashMap<>(); public Leader(){
map.put("打扫",new TargetA());
map.put("吃饭",new TargetB());
} @Override
public void doSomething(String command) {
map.get(command).doSomething(command);
} public static void main(String[] args) {
new Leader().doSomething("吃饭");
new Leader().doSomething("打扫");
}
}

  5. 策略模式

  背景:在软件开发过程中,要实现一种功能,需要多种算法或者策略,我们可以根据应用场景不同,选择不同算法和策略和实现该功能。比如一系列算法,把每个算法封装

  起来,并且使他们可以相互替换,这就是策略模式。

  假如我们有一个鸭子的抽象类,包含行为所有的鸭子都会游泳,属性鸭子的信息,如果我们增加一个飞行的功能,但是有些鸭子没有飞行的能力,所以我们不能再抽象类

  中加入飞行的方法。这时候,就需要我们抽象一个飞的接口。

  1.首先抽象一个策略接口

package ch.test.notes.designmodel;

/**
* Description:策略接口
*
* @author cy
* @date 2019年05月10日 12:37
* version 1.0
*/
public interface CarFunction { void run(); //每辆车有不同的行驶方法
}

  2.具体策略父类

package ch.test.notes.designmodel;

/**
* Description:每个车都具有的相同的属性和行为
*
* @author cy
* @date 2019年05月10日 12:38
* version 1.0
*/
public class Car implements CarFunction { protected String name; //车名字
protected String color; //车颜色 public Car(String name, String color) {
this.name = name;
this.color = color;
} @Override
public void run() {
System.out.println(color +" " + name +"在行驶。。。");
}
}

  具体策略实现子类

package ch.test.notes.designmodel;

/**
* Description:
*
* @author cy
* @date 2019年05月10日 13:09
* version 1.0
*/
public class SmallCar extends Car {
public SmallCar(String name, String color) {
super(name, color);
} @Override
public void run() {
System.out.println(color +" " + name +"在高速的行驶。。。");
}
}
package ch.test.notes.designmodel;

/**
* Description:
*
* @author cy
* @date 2019年05月10日 13:11
* version 1.0
*/
public class BussCar extends Car { public BussCar(String name, String color) {
super(name, color);
} @Override
public void run() {
System.out.println(color +" " + name +"在缓慢的行驶。。。");
} }

应用场景

package com.design.strategy;
/**
*
* @ClassName : Person
* @Description : 应用场景类
*
*/
public class Person {
private String name; //姓名
private Integer age; //年龄
private Car car; //拥有车 public void driver(Car car){
System.out.print(name +" "+ age+" 岁 "+" 开着");
car.run();
} public Person(String name,Integer age) {
this.name=name;
this.age=age;
} }

运行环境

package com.design.strategy;
/**
*
* @ClassName : Strategy
* @Description : 运行环境类:Strategy
* @date : 2017年12月9日 上午11:43:58
*
*/
public class Strategy {
public static void main(String[] args) {
Car smallCar = new SmallCar("路虎","黑色");
Car bussCar = new BussCar("公交车","白色");
Person p1 = new Person("小明", );
p1.driver(smallCar);
p1.driver(bussCar);
}
} 运行结果:
小明 岁 开着黑色 路虎在高速的行驶。。。
小明 岁 开着白色 公交车在缓慢的行驶。。。

   6.原型模式

  就是对对象的拷贝,深拷贝、浅拷贝生成新的对象。

  7.适配器模式  (由源到目标的适配)

  目标

public interface Robot
{
public void cry();
public void move();
}

  

public class Dog
{
    public void shout()
    {
        System.out.println("狗可以汪汪叫!");
    }
    public void run()
    {
        System.out.println("狗可以跑!");
    }
}

进行适配

public class DogAdapter extends Dog implements Robot
{
    public void cry(){
        System.out.print("机器人模仿:");
        super.shout();
    }
    public void move(){
        System.out.print("机器人模仿:");
        super.run();
    }
}

如果想要实现一个接口,但是又不想实现所有的接口,我们可以抽象出来一个方法,然后再去继承这个类,进行方法的复写,这也是适配模式

  

  

  

  

java 中设计模式的更多相关文章

  1. java中设计模式详解

    一.设计模式的分类 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外 ...

  2. Java中设计模式之工厂模式-4

    一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...

  3. Java中设计模式之生产者消费者模式-4

    引言 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另 ...

  4. Java中设计模式之装饰者模式-3

    装饰者模式: 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 装饰者核心:实现功能组合 继承与组合区别: 继承 继承是给一个类添加行为的比较有效的途径.通过使用继承, ...

  5. Java中设计模式之单例设计模式-1

    单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...

  6. java中的23中设计模式(转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

    Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...

  8. java开发中的23中设计模式详解--大话设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  9. java中的23中设计模式(转载的,有时间一定要熟读)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. python之log日志模块

    logging的配置大致有下面几种方式. 1.        通过代码进行完整配置,logging.getLogger()获取logger后,给logger设置各种handler. 2.       ...

  2. 【eclipse插件开发实战】Eclipse插件开发1——eclipse内核结构、扩展点机制

    Eclipse插件开发实战1--eclipse内核结构.扩展点机制 一.前言 本系列总体介绍eclipse插件开发基本理论.插件项目结构及开发步骤,最后再给出两个插件开发实例. 总体安排结构如下: 1 ...

  3. 【Linux学习】Linux文件系统1--文件系统的目录结构

    Linux文件系统1--文件系统的目录结构 一.linux文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 1.普通文件:如文本文件. ...

  4. sql server 2008 R2 升级与安装遇到的问题

    因工作需要,遂把以前的2008升级到r2,升级失败,具体原因忘了,卸载2008,清了注册表删了文件,结果安装的时候失败了,如下图: 下一步-有错误日志和错误的序列号,错误日志在C:\Program F ...

  5. ASP.NET学习笔记(一)相关概念

    ASP.NET 是一个开发框架,用于通过 HTML.CSS.JavaScript 以及服务器脚本来构建网页和网站. ASP.NET 支持三种开发模式: Web Pages MVC Web Forms ...

  6. 51nod - 1659 - 数方块 - 简单数学

    https://www.51nod.com/Challenge/Problem.html#!#problemId=1659 随便弄了一下发现公式,然后从cheatsheet抄一抄平方和公式,发现可以提 ...

  7. CF1175E Minimal Segment Cover 题解

    题意:给出\(n\)个形如\([l,r]\)的线段.\(m\)次询问,每次询问区间\([x,y]\),问至少选出几条线段,使得区间\([x,y]\)的任何一个部位都被至少一条线段覆盖. 首先有一个显然 ...

  8. maven - settings.xml文件详解

    Settings.xml配置文件详解 maven默认的settings.xml是一个包含注释和例子的模板,可以快速的修改settings.xml文件 maven安装后不会在用户目录下自动生成setti ...

  9. fetch请求数据,后台将cookie一起返回时

    请求时,添加以上标记的属性,就可以拿到后台给的cookie,并返回给后台.比如登录后才能有的操作,这样就需要返回给后台cookie从而判断是否登录

  10. laravel配合swoole使用总结

    最近对接硬件做了两个项目,用到了swoole 第一个是门禁系统,需要远程开门.离线报警.定时开门.离线刷卡等功能 1.远程开门: 目前用cli创建个临时客户端连接服务端发送命令,服务端处理完成后客户端 ...