26.享元模式

需求

小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同:
1)有客户要求以新闻的形式发布
2)有客户人要求以博客的形式发布
3)有客户希望以微信公众号的形式发布

UML

享元模式UML

类结构

享元抽象类: 定义享元对象 和 主要功能

享元实现类: 实现抽象功能

Web工厂类: 单例生产共享部分

User类: 用户【本案例中没什么用 就是非用用部分】

测试类: 调用方法 测试功能

代码实现

测试类

package com.yuan.dp.flyweighty;

public class FlyweihtyTest {
    public static void main(String[] args) {
        Web工厂类 webFactory = new Web工厂类();
        享元实现类 fly_1 = webFactory.getFlyweihty("微博",new User("小明1"));
        享元实现类 fly_4 = webFactory.getFlyweihty("微博",new User("小明2"));
        享元实现类 fly_2 = webFactory.getFlyweihty("网页",new User("小红1"));
        享元实现类 fly_5 = webFactory.getFlyweihty("网页",new User("小红2"));
        享元实现类 fly_3 = webFactory.getFlyweihty("视频",new User("小贺1"));
        享元实现类 fly_6 = webFactory.getFlyweihty("视频",new User("小贺2"));

        fly_1.use();
        fly_2.use();
        fly_3.use();
        fly_4.use();
        fly_5.use();
        fly_6.use();
        webFactory.getSize();
    }
}

/*
新闻类型是......微博       用户类型是....小明1
新闻类型是......网页       用户类型是....小红1
新闻类型是......视频       用户类型是....小贺1
新闻类型是......微博       用户类型是....小明1
新闻类型是......网页       用户类型是....小红1
新闻类型是......视频       用户类型是....小贺1
池中一共3个对象
*/

实现部分代码

package com.yuan.dp.flyweighty;

import java.util.HashMap;

public abstract class 享元抽象类 {
    abstract void use();
}




class 享元实现类 extends 享元抽象类{
    /**
     * 网站类型
     */
    private String type;
    private  User user;

    public 享元实现类(String type,User user) {
        this.type = type;
        this.user = user;
    }

    @Override
    void use(){
        System.out.println("新闻类型是......" + type  + "       用户类型是...." + user.getName());
    }
}

class Web工厂类{
    /**
     * Web池
     */
    HashMap webPool = new HashMap();

    /**
     * 获得一个网站类型
     * @param type 网站类型
     * @return 网站类型
     */
    public 享元实现类 getFlyweihty(String type ,User user){

        //如果没有就往池中放一个
        if (!webPool.containsKey(type)){
            webPool.put(type,new 享元实现类(type,user ));
        }
        return webPool.get(type);
    }

    /**
     *
     * @return
     */
    void getSize(){
        System.out.println("池中一共"+webPool.size()+"个对象");
    }
}
class User{
    /**
     * 用户姓名
     */
    private String name;

    public User(String name) {
        this.name = name;
    }

    /**
     * 获取用户姓名
     * @return 用户姓名
     */
    public String getName() {
        return name;
    }
}

享元模式介绍

抽象享元角色:定义享元类。

具体享元角色:实现了享元角色的必要方法。

享元工厂方法:负责创建管理享元角色。

平常不经意就会用到,实际学了也没啥效果........

你可能感兴趣的:(26.享元模式)