GoF定义:提供一个接口,用来创建一组相关联的或有依赖关系的对象,在不提供它们的具体类的前提下
在这个模式中,我们会为一组独立的工厂构建一个处理机制。这些工厂有一个共同的主题。在这里,这个接口用来创建相关联的对象。我们不会直接使用实现类或具体类。这个模式也叫做工厂的工厂或者超级工厂。使用这个模式,我们可以在不改变用户代码的前提下对特殊的某个实现进行修改,但是代价是会增加系统的复杂性。有时debug过程也会很困难
现实世界:假设我们要装修屋子,在买桌子的时候可以选择木头桌子或者钢制桌子,那么买不同的桌子要逛不同的家具店
代码世界:ADO.NET使用这个模式来建立和数据库的连接(不知道是什么)
public class AbstractFactoryPatternEx
{
public static void main(String[] args)
{
System.out.println("***Abstract Factory Pattern Demo***");
ActionMovieFactory actionMovies = new ActionMovieFactory();
ITollyWoodMovie tAction = actionMovies.getITollyWoodMovie();
IBollyWoodMovie bAction = actionMovies.getIBollyWoodMovie();
System.out.println("\nAction movies are:");
System.out.println(tAction.movieName());
System.out.println(bAction.movieName());
ComedyMovieFactory comedyMovies = new ComedyMovieFactory();
ITollyWoodMovie tComedy = comedyMovies.getITollyWoodMovie();
IBollyWoodMovie bComedy = comedyMovies.getIBollyWoodMovie();
System.out.println("\nComedy movies are:");
System.out.println(tComedy.movieName());
System.out.println(bComedy.movieName());
}
}
interface ITollyWoodMovie
{
String movieName();
}
interface IBollyWoodMovie
{
String movieName();
}
interface IMovieFactory
{
ITollyWoodMovie getITollyWoodMovie();
IBollyWoodMovie getIBollyWoodMovie();
}
class TollyWoodActionMovie implements ITollyWoodMovie
{
@Override
public String movieName()
{
return "Kranti is a Tollywood Action Movie";
}
}
class TollyWoodComedyMovie implements ITollyWoodMovie
{
@Override
public String movieName()
{
return "BasantaBilap is a Tollywood Comedy Movie";
}
}
class BollyWoodComedyMovie implements IBollyWoodMovie
{
@Override
public String movieName()
{
return "Munna Bhai MBBS is a Bollywood Comedy Movie";
}
}
class BollyWoodActionMovie implements IBollyWoodMovie
{
@Override
public String movieName()
{
return "Bang Bang is a Bollywood Action Movie";
}
}
class ActionMovieFactory implements IMovieFactory
{
@Override
public ITollyWoodMovie getITollyWoodMovie()
{
return new TollyWoodActionMovie();
}
@Override
public IBollyWoodMovie getIBollyWoodMovie()
{
return new BollyWoodActionMovie();
}
}
class ComedyMovieFactory implements IMovieFactory
{
@Override
public ITollyWoodMovie getITollyWoodMovie()
{
return new TollyWoodComedyMovie();
}
@Override
public IBollyWoodMovie getIBollyWoodMovie()
{
return new BollyWoodComedyMovie();
}
}
抽象工厂定义一组接口,每个接口返回的对象需要是有关联的(BollyMovie和TollyMoive),然后实现这个接口的所有工厂必须都能同时生产(创建)这些相关联的对象。感觉要用这个模式,起码系统的抽象可以多层分类,然后将一种类别拿出来做抽象工厂接口,然后另一种分类(具体产品还要实现抽象工厂接口的返回值的接口类型)实现抽象工厂接口,这样可以得到有两种类别属性的对象
原文:https://www.cnblogs.com/mouseGo/p/14106317.html