当项目中需要大量对象,大多数状态可以转为外部状态时,可以考虑元享模式
java实现代码如下(线程安全)
package com.liu.pattern13;
import java.util.concurrent.ConcurrentHashMap;
public class TestFlyweight extends Thread{
private BeanFactory beanFactory;
public BeanFactory getBeanFactory() {
return beanFactory;
}
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
@Override
public void run() {
for(int i=0;i<5;i++){
String name = "object"+i;
beanFactory.setBean(name);
}
}
public static void main(String[] args) throws InterruptedException{
TestFlyweight t1 = new TestFlyweight();
TestFlyweight t2 = new TestFlyweight();
TestFlyweight t3 = new TestFlyweight();
BeanFactory beanFactory = new BeanFactory();
t1.setBeanFactory(beanFactory);
t2.setBeanFactory(beanFactory);
t3.setBeanFactory(beanFactory);
t1.start();
t2.start();
t3.start();
t1.join();
t2.join();
t3.join();
System.out.println(beanFactory.getSize());
}
}
abstract class Bean{
public abstract void test();
}
class MyBean extends Bean{
private String name;
public MyBean(String name){
this.name = name;
}
@Override
public void test() {
System.out.println(name);
}
}
class BeanFactory{
private ConcurrentHashMap<String , Bean> beans;
public BeanFactory(){
beans = new ConcurrentHashMap<>();
}
public Object getBean(String name){
return beans.get(name);
}
public int getSize(){
return beans.size();
}
public void setBean(String name){
if(beans.get(name)==null){
beans.put(name, new MyBean(name));
}
}
}
c#代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
namespace com.liu.pattern13
{
class TestFlyweight
{
public static BeanFactory beanFactory{get;set;}
static void Main(string[] args)
{
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
Thread t3 = new Thread(run);
beanFactory = new BeanFactory();
t1.Start();
t2.Start();
t3.Start();
t1.Join();
t2.Join();
t3.Join();
System.Console.WriteLine(beanFactory.GetSize());
System.Console.ReadKey();
}
public static void run()
{
for (int i = 0; i < 5; i++)
{
String name = "object" + i;
beanFactory.SetBean(name);
}
}
}
abstract class Bean{
public abstract void Test();
}
class MyBean : Bean{
private String name;
public MyBean(String name){
this.name = name;
}
public override void Test() {
System.Console.WriteLine(name);
}
}
class BeanFactory{
private ConcurrentDictionary<String, Bean> beans;
public BeanFactory(){
beans = new ConcurrentDictionary<String, Bean>();
}
public Object GetBean(String name){
Bean bean = null;
beans.TryGetValue(name, out bean);
return bean;
}
public int GetSize(){
return beans.Count;
}
public void SetBean(String name){
if (!beans.ContainsKey(name))
{
beans.TryAdd(name, new MyBean(name));
}
}
}
}