设计模式--享元模式

  当客户需要的网站结构相似度很高,而且都不是访问量很高的网站。那么,就可以通过多个网站共用一套代码的方法,快速创建网站,通过不同ip地址区分,可以让维护和扩展更加容易。

目录

一、模式初识

1.什么是享元模式?

2.如何处理细粒度对象?

3.享元模式在编辑器系统中大量使用

二、模式深入

1.享元模式的核心是什么?

2.何时使用享元模式?

3.享元模式的优缺点

4.享元模式的本质:分离与共享

三、模式实例

  用享元模式实现五子棋操作(java语言)


一、模式初识

1.什么是享元模式?

  运用共享技术有效的支持大量细粒度对象。

2.如何处理细粒度对象?

  将对象的状态分为外部状态和内部状态,将可以共享的状态作为内部状态,而在适当情况将外部对象作为参数传递给对象。

3.享元模式在编辑器系统中大量使用

二、模式深入

1.享元模式的核心是什么?

  享元模式的重点是分离变与不变,内部状态是不变的,外部状态是变的。

2.何时使用享元模式?

  满足一下四个条件的系统可以使用享元对象

  ①一个系统有大量的对象

  ②这些对象消耗大量的内存

  ③这些对象的状态中的大部分都可以外部化

  ④这些对象可以按照内部状态分为很多的组,当把外部对象从对象中剔除时,每一个组都可以仅用一个对象代替。

3.享元模式的优缺点

  优点:大幅度的降低内存中对象的数量,节省内存空间

  缺点:

  ①.享元模式可以使系统更加的复杂。为了使对象可以共享,需要将一些状态外部化。

  ②.享元模式将向原对象的状态外部化,而读取外部状态使得运行时间变长。

4.享元模式的本质:分离与共享

三、模式实例

  用享元模式实现五子棋操作(java语言)

package a01a;

public class ChessPlace {
	private int x;
	private int y;
	private static int number=0;
	public ChessPlace(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	public ChessPlace() {
		super();
		// TODO Auto-generated constructor stub
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		ChessPlace.number = number;
	}
}


package a01a;

public interface Chess {
	public abstract void play(ChessPlace che);
}


package a01a;

public class Whitechess implements Chess {

	@Override
	public void play(ChessPlace che) {
		// TODO Auto-generated method stub
		System.out.println("白棋位置为:"+"("+che.getX()+","+che.getY()+")");
	}

}


package a01a;

public class Blackchess implements Chess {

	@Override
	public void play(ChessPlace che) {
		// TODO Auto-generated method stub
		System.out.println("黑棋位置为:"+"("+che.getX()+","+che.getY()+")");
	}

}

package a01a;

public class ChessFactory {
private Chess whiteChess;
private Chess blackChess;
public  Chess getChess(int key) {
	if(key%2==0) {
		if (whiteChess == null) {
            System.out.println("===创建白棋对象===");
            whiteChess = new Whitechess();
            ChessPlace cp=new ChessPlace();
            cp.setNumber(cp.getNumber()+1);
        }
        return whiteChess;	
	}
	else {
		 if (blackChess == null) {
             System.out.println("===创建黑棋对象===");
             blackChess = new Blackchess();
             ChessPlace cp=new ChessPlace();
             cp.setNumber(cp.getNumber()+1);
             }
	return blackChess;	
	}
 }
public void ChessNumber() {
	ChessPlace cp=new ChessPlace();
    System.out.println("创建的棋子种类为:"+cp.getNumber());
}
}

package a01a;

import java.util.Random;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ChessFactory cf=new ChessFactory();
		for (int i = 0; i < 6; i++) {
            Chess c = cf.getChess(i);
            ChessPlace place=new ChessPlace(i, new Random().nextInt(15));
            c.play(place);
        }
		cf.ChessNumber();
	}

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值