享元模式:“享”就是分享之意,指一物被众人共享,而这也正是该模式的终旨所在。享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。这个对象就可以避免到修改的问题。享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。
建筑接口:JianZhu
public interface Jianzhu {void use();}
体育馆实现类:TiYuGuan
public class TiYuGuan implements Jianzhu {private String name;private String shape;private String yundong;public TiYuGuan(String yundong){this.setYundong(yundong);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getShape() {return shape;}public void setShape(String shape) {this.shape = shape;}public String getYundong() {return yundong;}public void setYundong(String yundong) {this.yundong = yundong;}@Overridepublic void use() {System.out.println("该体育馆被使用来召开奥运会" + " 运动为:"+ yundong+" 形状为:"+shape+ " 名称为:"+name);}}
建筑工厂类:JianZhuFactory
import java.util.*;public class JianZhuFactory {private static final Map<String,TiYuGuan> tygs = new HashMap<String,TiYuGuan>();public static TiYuGuan getTyg(String yundong){TiYuGuan tyg = tygs.get(yundong);if(tyg == null){tyg = new TiYuGuan(yundong);tygs.put(yundong,tyg);}return tyg;}public static int getSize(){return tygs.size();}}
测试类:Clienter
public class Clienter {public static void main(String[] args) {String yundong ="足球";for(int i = 1;i <= 5;i++){TiYuGuan tyg = JianZhuFactory.getTyg(yundong);tyg.setName("中国体育馆");tyg.setShape("圆形");tyg.use();System.out.println("对象池中对象数量为:"+JianZhuFactory.getSize());}}}执行结果该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆对象池中对象数量为:1该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆对象池中对象数量为:1该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆对象池中对象数量为:1该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆对象池中对象数量为:1该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆对象池中对象数量为:1使用工厂模式进行配合,创建对象池,测试类中的循环,你可以想象成为要举行5场比赛,每场比赛的场地就是体育馆通过执行结果可以看出,在这个对象池(HashMap)中,一直都只有一个对象存在,第一次使用的时候创建对象,之后的每次调用都用的是那个对象,不会再重新创建。其实在Java中就存在这种类型的实例:String。它的常量池。在举个例子,书上的。比如word办公软件,当你输入一个汉字或者字母的时候,你可以理解为会将这个汉字或字母存放在一个池子里,当我再次输入同样的汉字或字母时,返回的还是该汉字和字母。不通因为重复,返回多个对象。
