问题的引入
不同网站具体数据和模板不同,核心代码和数据库是共享的
package 设计模式;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Text {
public static void main(String[] args) {
// TODO Auto-generated method stub
WebSite web1= new WebSite("产品展示");
web1.Use();
WebSite web2= new WebSite("产品展示");
web2.Use();
WebSite web3= new WebSite("产品展示");
web3.Use();
WebSite web4= new WebSite("博客");
web4.Use();
WebSite web5= new WebSite("博客");
web5.Use();
WebSite web6= new WebSite("博客");
web6.Use();
}
}
class WebSite
{
private String name="";
public WebSite(String name)
{
this.name=name;
}
public void Use()
{
System.out.println("网站分类:"+name);
}
}
享元模式:运用共享技术有效地支持大量细粒度的对象
package 设计模式;
import java.util.HashMap;
public class Text {
public static void main(String[] args) {
// TODO Auto-generated method stub
int extrinsic=22;
FlyweightFactory f=new FlyweightFactory();
Flyweight fx=f.getFlyweight("X");
fx.operate(--extrinsic);
Flyweight fy=f.getFlyweight("Y");
fy.operate(--extrinsic);
Flyweight fz=f.getFlyweight("Z");
fz.operate(--extrinsic);
Flyweight fex=f.getFlyweight("X");
fex.operate(--extrinsic);
Flyweight unsharedFlyweight=new UnsharedConcreteFlyweight("X");
unsharedFlyweight.operate(--extrinsic);
}
}
abstract class Flyweight
{
public String intrinsic;
protected final String extrinsic;
public Flyweight(String extrinsic)
{
this.extrinsic=extrinsic;
}
public abstract void operate(int extrinsic);
public String getIntrinsic()
{
return intrinsic;
}
public void setIntrinsic(String intrinsic)
{
this.intrinsic=intrinsic;
}
}
class ConcreteFlyweight extends Flyweight
{
public ConcreteFlyweight(String extrinsic)
{
super(extrinsic);
}
@Override
public void operate(int extrinsic) {
// TODO Auto-generated method stub
System.out.println("具体Flyweight:"+extrinsic);
}
}
class UnsharedConcreteFlyweight extends Flyweight
{
public UnsharedConcreteFlyweight(String extrinsic)
{
super(extrinsic);
}
@Override
public void operate(int extrinsic) {
// TODO Auto-generated method stub
System.out.println("不共享的具体Flyweight:"+extrinsic);
}
}
class FlyweightFactory
{
private static HashMap<String,Flyweight> pool=new HashMap<String,Flyweight>();
public static Flyweight getFlyweight(String extrinsic)
{
Flyweight flyweight=null;
if(pool.containsKey(extrinsic))
{
flyweight=pool.get(extrinsic);
System.out.print("已有"+extrinsic+"直接从池中取------>");
}
else
{
flyweight=new ConcreteFlyweight(extrinsic);
pool.put(extrinsic, flyweight);
System.out.print("创建"+extrinsic+"并从池中取出------>");
}
return flyweight;
}
}
具体实例
用享元模式实现网站共享
(不含外部状态)
package 设计模式;
import java.util.HashMap;
public class Text {
public static void main(String[] args) {
WebSiteFactory f=new WebSiteFactory();
WebSite fx=f.GetWebSiteCategory("产品展示");
fx.Use();
WebSite fy=f.GetWebSiteCategory("产品展示");
fy.Use();
WebSite fz=f.GetWebSiteCategory("产品展示");
fz.Use();
WebSite fl=f.GetWebSiteCategory("博客");
fl.Use();
WebSite fm=f.GetWebSiteCategory("博客");
fm.Use();
WebSite fn=f.GetWebSiteCategory("博客");
fn.Use();
}
}
abstract class WebSite
{
public abstract void Use();
}
class ConcreteWebSite extends WebSite
{
private String name="";
public ConcreteWebSite(String name)
{
this.name=name;
}
public void Use() {
System.out.println("网站分类:"+name);
}
}
class WebSiteFactory{
private static HashMap<String,WebSite>flyweights=new HashMap<String,WebSite>();//获得网站分类
public WebSite GetWebSiteCategory(String key)
{
if(!flyweights.containsKey(key))
{
WebSite flyweight=new ConcreteWebSite(key);
flyweights.put(key, flyweight);
}
return (flyweights.get(key));
}
public int GetWebSiteCount()
{
return flyweights.size();
}
}
带外部状态的网站共享
package 设计模式;
import java.util.HashMap;
public class Text {
public static void main(String[] args) {
WebSiteFactory f=new WebSiteFactory();
WebSite fx=f.GetWebSiteCategory("产品展示");
fx.Use(new User("小草"));
WebSite fy=f.GetWebSiteCategory("产品展示");
fy.Use(new User("大鸟"));
WebSite fz=f.GetWebSiteCategory("产品展示");
fz.Use(new User("小花"));
}
}
abstract class WebSite
{
public abstract void Use(User user);
}
class User
{
private String name;
User(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
}
class ConcreteWebSite extends WebSite
{
private String name="";
public ConcreteWebSite(String name)
{
this.name=name;
}
public void Use(User user)
{
System.out.println("网站分类:"+name+"用户:"+user.getName());
}
}
class WebSiteFactory
{
private static HashMap<String,WebSite>flyweights=new HashMap<String,WebSite>();
public WebSite GetWebSiteCategory(String key)
{
if(!flyweights.containsKey(key))
{
WebSite flyweight=new ConcreteWebSite(key);
flyweights.put(key, flyweight);
}
return (flyweights.get(key));
}
public int GetWebSiteCount()
{
return flyweights.size();
}
}