工厂方法模式:
每个具体工厂只有一个或者一组重载的工厂方法,只能生产一种产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。
抽象工厂模式:
一个工厂可以生产一系列产品(一族产品),极大减少了工厂类的数量
产品等级结构:产品等级结构即产品的继承结构
产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品
系统所提供的工厂生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构、属于不同类型的具体产品时就可以使用抽象工厂模式
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式
当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、更有效率
缺点:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,不能很好地支持“开闭原则”。
抽象工厂设计中的角色:
1、抽象产品
2、具体产品
3、抽象工厂
4、具体工厂
和工厂方法的角色相比,并没有什么不同,只不过抽象工厂中的产品等级结构不止一个;
工厂模式的退化:
当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。
package AbstractFactoryTest;
/*
* 抽象产品1
*/
interface artsInterface
{
public void createArts();
}
/*
* 抽象产品2
*/
interface scientistInterface
{
public void createScientist();
}
/*
* 具体产品1
*/
class artsA implements artsInterface{
@Override
public void createArts() {
System.out.println("文科生A已产生");
}
}
/*
* 具体产品2
*/
class scientistA implements scientistInterface{
@Override
public void createScientist() {
System.out.println("理科生A已产生");
}
}
/*
* 抽象工厂
*/
interface abstractFactory{
public artsInterface createConcreteArts();
public scientistInterface createConcreteScientist();
}
/*
* 具体工厂
*/
class concreteFactory implements abstractFactory{
@Override
public artsInterface createConcreteArts() {
// TODO Auto-generated method stub
return new artsA();
}
@Override
public scientistInterface createConcreteScientist() {
// TODO Auto-generated method stub
return new scientistA();
}
}
public class abstractFactoryModel {
public static void main(String[] args) {
abstractFactory af = new concreteFactory();
af.createConcreteArts().createArts();
}
}