增加享元模式和代理模式测试代码

This commit is contained in:
xuwujing
2018-09-25 17:43:02 +08:00
parent 83df550d27
commit d8c18a5c91
4 changed files with 224 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
package com.pancm.design.flyweight;
import java.util.HashMap;
import java.util.Map;
/**
* @Title: FlyweightTest
* @Description: 享元模式
* 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,
* 避免重新创建。
* 应用实例: 1、JAVA 中的 String如果有则返回如果没有则创建一个字符串保存在字符串缓存池里面。
* 2、数据库的数据池。
* 主要目的就是复用
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
public class FlyweightTest {
public static void main(String[] args) {
/*
* 享元模式的角色: Flyweight: 抽象享元类。所有具体享元类的超类或者接口通过这个接口Flyweight可以接受并作用于外部专题
* ConcreteFlyweight: 具体享元类。指定内部状态,为内部状态增加存储空间。
* UnsharedConcreteFlyweight: 非共享具体享元类。指出那些不需要共享的Flyweight子类。
* FlyweightFactory:
* 享元工厂类。用来创建并管理Flyweight对象它主要用来确保合理地共享Flyweight当用户请求一个Flyweight时
* FlyweightFactory就会提供一个已经创建的Flyweight对象或者新建一个如果不存在
*
* 享元模式的核心在于享元工厂类,享元工厂类的作用在于提供一个用于存储享元对象的享元池,用户需要对象时,首先从享元池中获取,如果享元池中不存在
* ,则创建一个新的享元对象返回给用户,并在享元池中保存该新增对象。
*
* 享元模式的目的是共享,避免多次创建耗费资源,单例模式的目的是限制创建多个对象以避免冲突等,所以即使都是一个对象,目的也不同。
*/
String names[] = { "张三", "李四", "王五", "虚无境" };
for (int i = 0; i < 8; i++) {
Penil penil = PenFactory.get(names[i>3?i-4:i]);
penil.setSomething("画了一条鱼");
penil.write();
}
/*
*
* 张三 第:1次创建
张三 用于铅笔 画了一条鱼
李四 第:1次创建
李四 用于铅笔 画了一条鱼
王五 第:1次创建
王五 用于铅笔 画了一条鱼
虚无境 第:1次创建
虚无境 用于铅笔 画了一条鱼
张三 用于铅笔 画了一条鱼
李四 用于铅笔 画了一条鱼
王五 用于铅笔 画了一条鱼
虚无境 用于铅笔 画了一条鱼
*/
}
}
/*
* 创建一支笔的接口
*/
interface Pen {
void write();
}
/*
* 创建一支铅笔
*/
class Penil implements Pen {
private String name;
private String something;
private int i;
public Penil(String name) {
this.name = name;
i++;
System.out.println(name+" 第:"+i+"次创建");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSomething() {
return something;
}
public void setSomething(String something) {
this.something = something;
}
@Override
public void write() {
System.out.println(name+" 用于铅笔 "+something);
}
}
/*
* 创建一个工厂
* 核心
*/
class PenFactory {
private static final Map<String, Penil> map = new HashMap<String, Penil>();
public static Penil get(String name) {
Penil penil = map.get(name);
if (penil == null) {
penil = new Penil(name);
map.put(name, penil);
}
return penil;
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 享元模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.flyweight;

View File

@@ -0,0 +1,90 @@
package com.pancm.design.proxy;
/**
* @Title: ProxyTest
* @Description:代理模式
* 在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
应用实例: 1、Windows 里面的快捷方式。 2、spring aop。 3、支票。
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
public class ProxyTest {
public static void main(String[] args) {
/*
*
优点: 1、职责清晰。 2、高扩展性。 3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作有些代理模式的实现非常复杂。
注意事项: 1、和适配器模式的区别适配器模式主要改变所考虑对象的接口而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别装饰器模式为了增强功能而代理模式是为了加以控制。
*/
/*
* <大话设计模式>中的追求者、代理者
* 张三想买东西,可以自己买,但是此时李四正好在商场,于是便让李四帮忙(代理)买了。
*/
String name = "张三";
String name2 = "李四";
Shopping shopping = new ExecutePerson(name);
Shopping shopping2 = new ExecutePerson(name2);
shopping.buyFood();
shopping2.buyFood();
/*
* 核心就是在不影响之前的功能下进行扩展
*/
}
}
/*
*
*/
interface Shopping {
void buyFood();
}
/*
* 定义一个需要买东西的人
*/
class ExecutePerson implements Shopping{
private String name;
public ExecutePerson(String name) {
this.name = name;
}
@Override
public void buyFood() {
System.out.println(name+" 买东西");
}
}
/*
* 定义一个可以帮买东西的人
*/
class ProxyPerson implements Shopping{
private String name;
private ExecutePerson ep;
public ProxyPerson(String name) {
this.name = name;
}
@Override
public void buyFood() {
if(ep == null){
ep = new ExecutePerson(name);
}
ep.buyFood();
}
}

View File

@@ -0,0 +1,8 @@
/**
* @Title: package-info
* @Description: 代理模式
* @Version:1.0.0
* @author pancm
* @date 2018年8月8日
*/
package com.pancm.design.proxy;