设计模式(二) 抽象工厂模式

来源:互联网 发布:ldc数据库 编辑:程序博客网 时间:2024/05/12 12:46

前面我们说了工厂方法模式,当只需要生产某一种类的时候可以使用。如果我们需要生产多类产品,就可以考虑使用抽象工厂模式。

抽象工厂模式的使用情景如下:

  • 系统需要多种产品,但是每次只需要一组产品。
  • 产品种类较固定,产品的组合可能频繁变化。

说得好像有点云里雾里,所以先看一个例子吧。首先我们先来定义两组产品接口,一个是调料,一个是食物。

public interface Food {    String getFood();}public interface Spice {    String getSpice();}

然后我们来定义生产食物和调料的抽象工厂。

public interface AbstractFactory {    Spice getSpice();    Food getFood();}

然后我们定义两个具体工厂,一个生产蛋糕,一个生产辣条。注意这里使用了Java 8的Lambda表达式。

public class CakeFactory implements AbstractFactory {    @Override    public Spice getSpice() {        return () -> "糖";    }    @Override    public Food getFood() {        return () -> "蛋糕";    }}public class LatiaoFactory implements AbstractFactory {    @Override    public Spice getSpice() {        return () -> "辣椒";    }    @Override    public Food getFood() {        return () -> "辣条";    }}

然后我们获取一下蛋糕和辣条。可以看到如果需要获取某组产品(糖和蛋糕、辣椒和辣条),那么抽象工厂模式非常适合。而且要创建新的产品组合也很简单,只需要实现一个新的具体工厂即可。

public void run() {    AbstractFactory factory = new CakeFactory();    Spice spice = factory.getSpice();    Food food = factory.getFood();    printSpiceAndFood(spice, food);    factory = new LatiaoFactory();    spice = factory.getSpice();    food = factory.getFood();    printSpiceAndFood(spice, food);}private static void printSpiceAndFood(Spice spice, Food food) {    System.out.println("调料:" + spice.getSpice() + "," + "食物:" + food.getFood());}

比如说我们要创建一个新的咸鸭蛋工厂,也非常简单。

public class SaltyEggFactory implements AbstractFactory {    @Override    public Spice getSpice() {        return () -> "盐";    }    @Override    public Food getFood() {        return () -> "咸鸭蛋";    }}

那么抽象工厂模式的缺点是什么呢?其实从上面的例子中我们也可以看出来了。抽象工厂模式创建新的产品组合非常简单(实现新的具体工厂),但是如果我们要增加新的产品种类,代码就需要进行大量更改了。比方说我们现在需要添加一个餐具,那么上面的抽象工厂类、三个具体类的代码就必须全部进行更改。在实际情况中,这往往会破坏代码开发者和使用者之间的协定。

说到这里,抽象工厂模式的优缺点和使用场景也就呼之欲出了。如果系统中需要多种类型的产品,而产品的种类相对固定,不会出现新类型,这时候就可以使用抽象工厂模式。符合这种情景的都可以使用抽象工厂,例如为软件更换界面,由于界面的标题栏、菜单栏等组件相对固定,所以这些可以声明为一个抽象工厂,然后每一中界面样式为一个具体实现工厂。

0 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机迅雷下载不了的资源怎么办 快手官方私信你的作品违规了怎么办 顺丰生鲜速配食物坏了怎么办 半年汽车没有年检 交警抓到怎么办 没年检的车子被交警抓到怎么办 去年检的路上被交警抓了怎么办 微信聊天界面群聊删除找不到怎么办 微博抽奖的奖品没发货怎么办 两个微信号绑了一个手机号怎么办 欧月玫瑰花朵叶子上有白粉怎么办 进对方空间被挡不想让他知道怎么办 qq上买东西给钱了对方没给怎么办 微信钱包手势密码忘记了怎么办 买家一起拍了两件宝贝怎么办 宿雾航空付款无法显示验证码怎么办 不小心把购物车的东西删了怎么办 微信在别人电脑登录忘退出怎么办 微信电脑版忘了退出怎么办 给微商交了定金不给退怎么办 方舟手游飞龙驯服时间不够怎么办 淘宝上买了假货找不到商家怎么办 魅蓝手机一直在开机画面怎么办 在实体店买的手机想退怎么办 淘宝买了东西发货了不想要了怎么办 快递已经发货了不想要了怎么办 锤子手机买了不到十天碎屏了怎么办 唯品会新人专享优惠卷过期了怎么办 我微信被系统说赌博登陆不起怎么办 平湖新居民积分卡怎么办办好办吗 电话卡插上去只能打紧急电话怎么办 不小心充错q币了怎么办 液相色谱柱堵了怎么办处理柱子 扣扣空间宠物消消87关怎么办 微信钱包里的钱忘记密码了怎么办 支付宝绑定银行卡要验证码怎么办 微信红包超出20万限额怎么办 微信充电信的号码话费没到账怎么办 农业银行手机银行转账转错了怎么办 微信钱包里的零钱不见了怎么办 买家说支付宝没钱要微信付钱怎么办 微信红包没绑卡密码忘了怎么办