小型的外包项目, 给客户A做一个产品展示网站, 客户A的朋友感觉效果很不错, 也需要做这样的产品网站, 但是要求都有些不同
对类图的说明对原理图的说明-即(模式的角色及职责)
比如围棋、五子棋、跳棋,它们都有大量的棋子对象,围棋和五子棋只有黑白两色,跳棋颜色多一点,所以棋子颜色就是棋子的内部状态;而各个棋子之间的差别就是位置的不同,当我们落子后,落子颜色是定的,但位置是变化的,所以棋子坐标就是棋子的外部状态
package com.flower.xiangyuan;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class TestMain {
public static void main(String[] args) {
WebSiteFactory webSiteFactory = new WebSiteFactory();
WebSite xw = webSiteFactory.getWebSite("新闻");
WebSite bk = webSiteFactory.getWebSite("博客");
WebSite wechat = webSiteFactory.getWebSite("微信公众号");
xw.use(new User("张三"));
bk.use(new User("李四"));
wechat.use(new User("王五"));
Integer webSiteCount = webSiteFactory.getWebSiteCount();
System.out.println("网站总数:"+webSiteCount);
}
}
abstract class WebSite{
public abstract void use(User user);
}
class ConcreteWebSite extends WebSite{
// 网站发布的形式 内部状态
private String type = "";
public ConcreteWebSite(String type) {
this.type = type;
}
@Override
public void use(User user) {
System.out.println("网站的发布形式为:"+type + ", " + user.getName() +" 正在使用");
}
}
class WebSiteFactory{
private Map<String,ConcreteWebSite> map = new HashMap<>();
// 根据类型返回网站
public WebSite getWebSite(String type){
return Optional.ofNullable(map.putIfAbsent(type, new ConcreteWebSite(type))).orElseGet(() -> map.get(type));
}
// 统计总数
public Integer getWebSiteCount(){
return map.size();
}
}
@Data
@AllArgsConstructor
class User{
private String name;
}
Integer源码
其实我感觉这个模式的举例并不好, 应为在真正的开发中, 不可能, 我多个客户, 你给人家部署一套代码, 但是这个模式的思想还是很好的