什么是抽象工厂模式
简单工厂模式可以生产多种产品,但是不满足开闭原则,工厂模式满足开闭原则,但是一个工厂不能生产多个商品,而抽象工厂模式相当于结合了两者的优点,在一定程度上可以满足开闭原则,同时一个工厂也可以生产多个商品。
抽象工厂模式的角色
AbstractFactory:抽象工厂,定义工厂的共有方法
ConcreteFactory:具体工厂,定义工厂生产的具体产品
AbstratcProduct:抽象产品,定义产品的共有特性
Product:具体产品,用于描述具体的产品信息
抽象工厂模式有两个概念:
产品等级结构:上图红框处
产品组:上图黑框处
下面简单实现一个实例
Factory:
package AbstractFactory;
/**
*
* @author lzy
*/
public interface Factory {
chopsticks getchopsticks();
lunch getLunch();
}
lunch:
package AbstractFactory;
/**
*
* @author lzy
*/
public interface lunch {
void eat();
}
chopsticks:
package AbstractFactory;
/**
*
* @author lzy
*/
public interface chopsticks {
void use();
}
ProductLunchA:
package AbstractFactory;
/**
*
* @author lzy
*/
public class ProductLunchA implements lunch{
@Override
public void eat() {
System.out.println("吃小龙虾");
}
}
ProductLunchB:
package AbstractFactory;
/**
*
* @author lzy
*/
public class ProductLunchB implements lunch{
@Override
public void eat() {
System.out.println("吃椰子鸡");
}
}
ProductChopsticksA:
package AbstractFactory;
/**
*
* @author lzy
*/
public class ProductChopsticksA implements chopsticks{
@Override
public void use() {
System.out.println("使用木制筷子");
}
}
ProductChopsticksB:
package AbstractFactory;
/**
*
* @author lzy
*/
public class ProductChopsticksB implements chopsticks{
@Override
public void use() {
System.out.println("使用玉制筷子");
}
}
FactoryA:
package AbstractFactory;
/**
*
* @author lzy
*/
public class FactoryA implements Factory{
@Override
public chopsticks getchopsticks() {
return new ProductChopsticksA();
}
@Override
public lunch getLunch() {
return new ProductLunchA();
}
}
FactoryB:
package AbstractFactory;
/**
*
* @author lzy
*/
public class FactoryB implements Factory{
@Override
public chopsticks getchopsticks() {
return new ProductChopsticksB();
}
@Override
public lunch getLunch() {
return new ProductLunchB();
}
}
main:
package AbstractFactory;
/**
*
* @author lzy
*/
public class main {
public static void main(String[] args){
Factory faca=new FactoryA();
lunch pa=faca.getLunch();
chopsticks cha=faca.getchopsticks();
cha.use();
pa.eat();
Factory facb=new FactoryB();
lunch pb=facb.getLunch();
chopsticks chb=facb.getchopsticks();
chb.use();
pb.eat();
}
运行结果:
抽象工厂模式的一点思考
优点:
抽象工厂模式使一个工厂可以生产多种商品,向客户端屏蔽了生产产品的具体细节,当我们添加产品组时,只需要在创建一个工厂用于生产对应的产品即可,可以很好的满足开闭原则。
缺点:
当我们添加产品等级结构时,我们需要更改抽象工厂以便生产新的产品等级结构,抽象工厂的更改意味着我们要更改所有的具体工厂类,此时不能很好的满足开闭原则
抽象工厂模式中一个具体工厂生产的产品之间应该具有一定联系,例如例子中的食物与筷子