目录
一.介绍
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
应用实例:工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
使用场景: 1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。
二.场景
伊利工厂/蒙牛工厂制造雪糕和牛奶
三.实现
1.抽象产品类雪糕
package xyz.hashdog.abstractfactory;
/**
* 雪糕抽象产品类
*/
public interface IceCream {
/**
* 打印产品名
*/
void printName();
}
2.抽象产品类牛奶
package xyz.hashdog.abstractfactory;
/**
* 牛奶抽象产品类
*/
public interface Milk {
/**
* 打印产品名
*/
void pringName();
}
3.抽象工厂
package xyz.hashdog.abstractfactory;
/**
* 抽象工厂
*/
public interface StoreFactory {
IceCream getIceCream();
Milk getMilk();
}
4.蒙牛雪糕产品类
package xyz.hashdog.abstractfactory;
/**
* 蒙牛雪糕产品类
*/
public class MengNiuIceCream implements IceCream {
@Override
public void printName() {
System.out.println("我是蒙牛雪糕");
}
}
5.蒙牛牛奶产品类
package xyz.hashdog.abstractfactory;
/**
* 蒙牛牛奶
*/
public class MengNiuMilk implements Milk {
@Override
public void pringName() {
System.out.println("我是蒙牛牛奶");
}
}
6.蒙牛工厂类
package xyz.hashdog.abstractfactory;
/**
* 蒙牛集团/专门店/工厂
*/
public class MengNiuFactory implements StoreFactory {
@Override
public IceCream getIceCream() {
return new MengNiuIceCream();
}
@Override
public Milk getMilk() {
return new MengNiuMilk();
}
}
7.伊利雪糕产品类
package xyz.hashdog.abstractfactory;
/**
* 伊利雪糕产品类
*/
public class YiLiIceCream implements IceCream {
@Override
public void printName() {
System.out.println("我是伊利雪糕");
}
}
8.伊利牛奶产品类
package xyz.hashdog.abstractfactory;
/**
* 伊利牛奶
*/
public class YiLiMilk implements Milk {
@Override
public void pringName() {
System.out.println("我是伊犁牛奶");
}
}
9.伊利工厂类
package xyz.hashdog.abstractfactory;
/**
* 伊利集团/专门店/工厂
*/
public class YiLiFactory implements StoreFactory {
@Override
public IceCream getIceCream() {
return new YiLiIceCream();
}
@Override
public Milk getMilk() {
return new YiLiMilk();
}
}
10.场景类
package xyz.hashdog.abstractfactory;
/**
* 抽象工厂模式
*/
public class Main {
public static void main(String[] args) {
YiLiFactory yiLiFactory = new YiLiFactory();
IceCream iceCream = yiLiFactory.getIceCream();
iceCream.printName();
Milk milk = yiLiFactory.getMilk();
milk.pringName();
}
}
11.执行