我们经常想从数据库构建它们,但我们可能还想创建用于测试或从文件加载的假货。
我们是否应该有一个构造函数:
我不喜欢选项1,因为这意味着每个班级都需要知道library(ggmap)
library(plyr)
img_Mapa <- get_map('Brazil', zoom = 4)
val_Qtd <- c(34, 10, 11, 7, 55, 18, 33, 16, 16, 249)
nom_State <- c("Distrito Federal","Bahia","Ceara","Espirito Santo","Minas Gerais","Parana","Rio de Janeiro","Rio Grande do Sul","Santa Catarina","Sao Paulo")
lon <- c(-47.86447, -41.70073, -39.32062, -40.30886, -44.55503, -52.02154, -43.20940, -51.21770, -50.21886, -46.62918)
lat <- c(-15.799765, -12.579738, -5.498398, -19.183423, -18.512178, -25.252089, -22.913948, -30.034632, -27.242339, -23.543179)
ds_DadosAcessos <- data.frame(char = nom_State, lon, lat, val_Qtd)
temp <- apply(ds_DadosAcessos, 1, function(x) { data.frame(lon = as.numeric(rep(x[2], log(as.numeric(x[4])))),
lat = as.numeric(rep(x[3], log(as.numeric(x[4])))))})
heatdata2 <- ldply(temp, rbind)
ggmap(img_Mapa, extent = "device") +
stat_density2d(data = heatdata2,
aes(x = lon, y = lat, fill = ..level.. , alpha = ..level..),
geom = "polygon", position = "identity", contour = TRUE, n = 100) +
scale_fill_gradient(low = "green", high = "red") +
scale_alpha(range = c(0, 0.3), guide = FALSE)
,2似乎没问题,但是我们想要添加字段时似乎需要大量维护,而且3似乎没问题也可以在任何时候添加一个字段(尽管少于2个)进行维护。
提前致谢。
答案 0 :(得分:1)
不可变对象通常是通过创建构建器构建的,然后将所有属性设置为相关的,最后调用Commit()
来检索它的不可变版本。
我个人非常喜欢看起来像这样的“虚假”不可变类:
public interface IPlanet
{
string Name { get; }
}
internal class PlanetBuilder : IPlanet
{
public string Name { get; set; }
public IPlanet Commit()
{
return this;
}
}
这种结构的优点是写入的开销非常小。 Commit()
方法甚至可以重构为通用基类。
不好的是,任何人都可以通过将对象强制转换为工厂类类型来篡改对象。