之前工厂模式说到不明白工厂模式与简单工厂的区别。后来想到,简单工厂,每当添加一个具体产品时,需要在工厂中进行判断修改;而工厂方法中,将工厂进行抽象,对产品进行细致的生产,即要生产某个具体产品时,需要对应的具体工厂,添加产品时,需要添加一个新的对应的工厂类以及对应的具体产品类。
说起来有点绕,但联系上抽象工厂模式,或许能稍微理解。
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,它围绕一个超级工厂来创建其他工厂
也就是说,抽象工厂模式中,创建的产品不再是一种产品了,而是多种产品(类族)了。
好比一个集团下有两个品牌产品A、B,每个品牌都有一系列的产品A1、A2、…,B1、B2、…尽管产品不是同种类型,但是营销模式下是一致的,都分为各种风格1、2…这些产品生产方式就是通过1工厂来生产1风格产品,2工厂来生产2风格产品…
这样,每次要生产新的一个风格产品时,只需要新建一个对应工厂即可;
同样缺点很明显,当要添加一个新品牌时,需要在各个工厂实现修改。
//超级工厂,定义生产什么品牌产品
public interface AbstractFactory {
Product_A createA();
Product_B createB();
}
//A品牌产品,品牌产品接口(同类族产品)
public interface Product_A {
void display();
}
//B品牌产品,AB两产品类族不同(如键盘和鼠标)
public interface Product_B {
void display();
}
//大众风格工厂,每个工厂都能生产所有的品牌产品
public class BigFactory implements AbstractFactory{
@Override
public Product_A createA() {
return new Pro_Big_A();
}
@Override
public Product_B createB() {
return new Pro_Big_B();
}
}
//小众风格产品
public class SmallFactory implements AbstractFactory{
@Override
public Product_A createA() {
return new Pro_Small_A();
}
@Override
public Product_B createB() {
return new Pro_Small_B();
}
}
//具体产品,如雷蛇键盘
public class Pro_Big_A implements Product_A{
@Override
public void display() {
System.out.println("大A产品");
}
}
//雷蛇鼠标
public class Pro_Big_B implements Product_B{
@Override
public void display() {
System.out.println("大B产品");
}
}
//牧人马键盘
public class Pro_Small_A implements Product_A{
@Override
public void display() {
System.out.println("小A产品");
}
}
//牧人马鼠标
public class Pro_Small_B implements Product_B{
@Override
public void display() {
System.out.println("小B产品");
}
}
假如以上是一个键鼠例子,每个工厂就是一个品牌工厂,雷蛇公司能生产雷蛇键鼠,牧人马公司也能生产牧人马牌子的键鼠。如果要添加一个罗技公司牌子的键鼠,只需要添加对应的工厂即可。但是假设这几家公司要添加一个产品如生产雷蛇品牌的耳机,这时候修改起来,麻烦程度可想而知了。