增加享元模式和代理模式测试代码
This commit is contained in:
118
src/main/java/com/pancm/design/flyweight/FlyweightTest.java
Normal file
118
src/main/java/com/pancm/design/flyweight/FlyweightTest.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @Title: package-info
|
||||
* @Description: 享元模式
|
||||
* @Version:1.0.0
|
||||
* @author pancm
|
||||
* @date 2018年8月8日
|
||||
*/
|
||||
package com.pancm.design.flyweight;
|
||||
90
src/main/java/com/pancm/design/proxy/ProxyTest.java
Normal file
90
src/main/java/com/pancm/design/proxy/ProxyTest.java
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
8
src/main/java/com/pancm/design/proxy/package-info.java
Normal file
8
src/main/java/com/pancm/design/proxy/package-info.java
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* @Title: package-info
|
||||
* @Description: 代理模式
|
||||
* @Version:1.0.0
|
||||
* @author pancm
|
||||
* @date 2018年8月8日
|
||||
*/
|
||||
package com.pancm.design.proxy;
|
||||
Reference in New Issue
Block a user