码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式--抽象工厂

时间:2020-08-20 18:28:59      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:pac   需要   new   inter   turn   抽象工厂   create   cto   package   

3. 抽象工厂模式

1. 介绍

  • 抽象工厂是应对产品族概念的

  • 上边的工厂方法模式是一种极端情况的抽象工厂模式(即只生产一种产品的抽象工厂模式), 而抽象工厂模式可以看成是工厂方法模式的一种推广

上面的工厂方法, 一个工厂只能生产一种产品, 所有有了抽象工厂模式, 用来在一个具体的工厂中生产多个产品, 既然多了一个产品, 就需要新增也给产品的接口, 同样我们依然需要简单工厂中的产品.

  1. 我们需要在包中新增加一个产品:水,具体的产品有:苏打水,矿泉水,接口如下
package com.only.abstractfactory;

public interface Water {
   void name();
}
  1. 两个新增的具体化的产品

矿泉水

package com.only.abstractfactory;

public class WaterA implements Water{
   @Override
   public void name() {
       System.out.println("矿泉水");
  }
}

苏打水

package com.only.abstractfactory;

public class WaterB implements Water{
   @Override
   public void name() {
       System.out.println("苏打水");
  }
}
  1. 因为以前的工厂只能生产一种产品, 所以我们就需要另一个抽象的工厂类, 这个工厂类既可以生产瓶子, 又可以生产水
package com.only.abstractfactory;

import com.only.simplefactory.Bottle;

abstract public class AbstractFactory {
   abstract public Bottle createBottle();
   abstract public Water createWater();
}
  1. 但每个具体的工厂,可能生产不同的水和瓶子

A工厂生产塑料瓶 和 矿泉水

package com.only.abstractfactory;

import com.only.simplefactory.Bottle;
import com.only.simplefactory.BottleA;

public class AbstractFactoryA extends AbstractFactory{
   @Override
   public Bottle createBottle() {
       return new BottleA();
  }
   @Override
   public Water createWater() {
       return new WaterA();
  }
}

B工厂生产玻璃瓶和苏打水

package com.only.abstractfactory;

import com.only.simplefactory.Bottle;
import com.only.simplefactory.BottleB;

public class AbstractFactoryB extends AbstractFactory{
   @Override
   public Bottle createBottle() {
       return new BottleB();
  }
   @Override
   public Water createWater() {
       return new WaterB();
  }
}

2. 图示

技术图片

3. 工厂模式区别

  • 简单工厂: 使用一个工厂对象用来生产同一等级架构中的任意产品(不支持扩展增加产品)

  • 工厂方法: 使用多个工厂对象用来生产同一等级结构中对应的固定产品. (支持扩展增加产品)

  • 抽象方法: 使用多个工厂对象用来生产不同产品品族的全部产品(不支持扩展新增产品; 支持增加品族)

设计模式--抽象工厂

标签:pac   需要   new   inter   turn   抽象工厂   create   cto   package   

原文地址:https://blog.51cto.com/14901322/2521155

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!