Flyweight模式(享元)
如果将Java追溯到一定程度,就不可避免地会碰到设计模式这个概念。 了解设计模式将有助于更好地了解接口和抽象系统在Java中的应用。 设计模式在Java的中型系统中广泛使用,遵循一定的编程模式可以使自己的代码更容易理解和交流。 Flyweight (是常用的模式。
Flyweight模式是提高程序效率和性能的模式,大幅提高程序的执行速度。 应用场合多为:例如从一个数据库中读取一系列字符串。 由于其中许多字符串是重复的,因此可以将这些字符串保存到Flyweight池(pool )中。
定义:避免大量具有相同内容的小类开销(如内存消耗),允许大家共享一个类(元类)。
作为本来目的的:面向对象语言,原则上全部是对象,但在实际使用中,对象数量可能会变得巨大。 例如,文字处理软件,将每个文字作为1个对象的情况下,数千个文字,对象数为数千,无疑会消耗内存。 如果是这样,仍然需要通过“求同存异”,找出这些对象群的共同点,设计元类,封装可以共享的类。 另外
这里以咖啡外卖店为例
编写了四个java类来说明如何实现Flyweight设计模式;
客人买咖啡点。 订单只区分咖啡的味道。 如果有1W个订单,咖啡店只卖20种口味的咖啡,我们就没有必要生成1W个订单对象。 在机会模式下只需生成20个订单对象。
这个例子列举得不多,但足以说明问题。 下面是具体的代码。
1、
Order.java订单抽象类
2、
FlavorOrder.java订单实现类
3、
FlavorFactory.java订单生成工厂
4、
Client.java客户类,具有main方法的测试类
=================1,
Order.java
打包流量;
公共类订单{
//执行销售动作
public abstract void sell (;
//获得咖啡的味道
公共字符串获取标志(;
}
===================1end
=================2、
FlavorOrder.java
打包流量;
publicclassflavororderextendsorder { privatestring flavor;
publicflavororder(stringflavor ) {
this.flavor=flavor;
}
公共字符串获取标志
return this.flavor;
}
公共void sell () {
System.out.println ('卖一杯[' flavor ']。' );
}
}
==================2end
==================3、
FlavorFactory.java
打包流量;
import java.util.HashMap;
import java.util.Map;
公共类flavor factory {
//订单池
私有
Map flavorPool=new
Hashmap(20;
//静态工厂,负责订单对象的生成
privatestaticflavorfactoryflavorfactory=new
FlavorFactory (;
私有标志工厂
publicstaticflavorfactorygetinstance (
{
返回
flavorFactory;
}
//接受订货
公共文件夹(string flavor )。
订单订单
=空;
flavor pool.contains key (flavor ) ) )。
order=flavorpool.get(flavor );
}else{
//收到新口味的订单
order=newflavororder(flavor;
//放入对象池
flavorpool.put(flavor,
订单; }
返回
订单;
}
//获得已经出售的咖啡的全部味道数
public int getTotalFlavorsMade (
返回
flavorPool.size (;
}
}
===================3end
=================4,
Client.java
打包流量;
import java.util.ArrayList;
import java.util.List;
公共类客户端{
//客户订单
私有静态
List orders=new
Arraylist(100;
//订购对象生成工厂
privatestaticflavorfactoryflavorfactory;
//增加订单
私有状态声明(字符串标志)。
{
orders.add (flavor factory.get order ) flavor );
}
publicstaticvoidmain (string [ ] args ) )。
{
//订单生成工厂
flavor factory=flavor factory.getinstance (;
//增加订单
takeOrders (摩卡);
takeOrders ('卡布奇诺);
takeOrders ('香草明星冰音乐);
takeOrders ('香草明星冰音乐);
拿铁(拿铁);
takeOrders ('卡布奇诺);
拿铁(拿铁);
takeOrders ('卡布奇诺);
takeOrders (摩卡);
takeOrders ('香草明星冰音乐);
takeOrders ('卡布奇诺);
takeOrders (摩卡);
takeOrders ('香草明星冰音乐);
拿铁(拿铁);
拿铁(拿铁);
//卖咖啡
订单
订单:订单) {
order.sell (;
}
//打印生成的订单java对象的数量
system.out.println(n客户一共购买了orders.size ) )。
“来杯咖啡! " );
//打印生成的订单java对象的数量
现在有system.out.println(n共生是“flavor factory.gettotalflavorsmade”)个FlavorOrder java对象!
();
}
}
===================4end