享元模式

一个系统中,如果有很多一样的对象,就会浪费内存。享元模式即共享相同的对象,比如一台打印机打印时需根据用户要求使用不同字体,如果在print函数里面实例化字体,就会创建很多相同的字体,浪费资源。

import java.util.HashMap;
import java.util.Map;

abstract class Font{
    public abstract void print(String str);
}

class FontA extends Font{
    @Override
    public void print(String str) {
        System.out.println("A字体的[" + str + "]");
    }
} 

class FontB extends Font{
    @Override
    public void print(String str) {
        System.out.println("B字体的[" + str + "]");
    }
} 

class FontFactory{
    private Map<String, Font> fonts = new HashMap<String, Font>();

    private Font createFontByName(String name){
        if("A".equals(name)){
            return new FontA();
        } else {
            return new FontB();
        }
    }

    public Font getFontByName(String name){
        if(fonts.containsKey(name)){
            return (Font)fonts.get(name);
        } else {
            Font res = createFontByName(name);
            fonts.put(name, res);
            return res;
        }
    }
}

class Printer {
    FontFactory fontFactory = new FontFactory();
    public void print(String str, String fontName){
        Font font = fontFactory.getFontByName(fontName);
        font.print(str);
    }
}

public class Main{
    public static void main(String[] args){
        Printer printer = new Printer();
        printer.print("abc", "A");
        printer.print("abc", "A");
        printer.print("abc", "B");
        printer.print("abc", "B");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值