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. Jquery等待ajax执行完毕继续执行(断点调试正常,运行异常)

    以前写过一个程序,发现用断点调试的时候,一步步的运行,程序是可以的,但是去了断点程序就出现了问题. $(document).ready(function(){ var arra=new Array() ...

  2. .net 反射构造你自己的“匿名”对象

    由于近来项目的底层架构某些特殊需求及场景的需要要求动态build一个对象, 属性名称个类与类型都是外界动态传入的. 不多说废话,直接上我最原始的代码: public static Type GetMy ...

  3. 【WIP】LaTex入门

    创建: 2018/06/15 说明: 这鸟东西实在没什么用的感觉,无奈学校报告要用这个写.无奈抽点时间学一下.                    

  4. PhpStrom之添加文件夹至左侧目录树

    1.打开编辑器,点击工具栏 File,并选择Open (File -> Open) 2.选择需要添加的文件夹路径,点击 OK 3.点击OK后弹出下图窗口(第一个选项:Open in new wi ...

  5. Lightoj 1098【数学/玄学】

    题意: 对于每个数求除1和本身的约数和,然后求前n个数的所有这种约数的和: 思路: 首先可以知道对于约数考虑就好了, 对于1-n的约数,n/2-1(减1是因为2不算啊)就是约数为2出现过的次数 如果n ...

  6. 3DMAX 7 角色建模1 人头建模

    说明: mesh与poly 可编辑多边形是一个多边形网格:即与可编辑网格不同,其使用超过三面的多边形.可编辑多边形非常有用,因为它们可以避免看不到边缘.例如,如果您对可编辑多边形执行切割和切片操作,程 ...

  7. [Xcode 实际操作]一、博主领进门-(13)在控制台的几种打印输出语句和po命令

    目录:[Swift]Xcode实际操作 本文将演几种在控制台输出日志的方式. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class ...

  8. urllib库的基本使用

    urllib库的使用 官方文档地址:https://docs.python.org/3/library/urllib.html 什么是urllib Urllib是python内置的HTTP请求库包括以 ...

  9. CentOS 部署RabbitMQ集群

    1. 准备两台CentOS,信息如下: node1:10.0.0.123 node2:10.0.0.124 修改hostname请参照: $ hostname # 查看当前的hostname $ ho ...

  10. go语言的特点

    Go语言保证了既能到达静态编译语言的安全和性能,又达到了动态语言开发维护的高效率 ,使用一个表达式来形容Go语言:Go = C + Python , 说明Go语言既有C静态语言程 序的运行速度,又能达 ...