Abstract Factory Patterns
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();
}
}
Note
- 如果系统不关心它的产品是怎么创建或者组合的,可以使用这个模式
- 当处理多个工厂的时候可以使用这个模式
- 这个模式将所有具体类分离,让改变产品的过程变得很容易(改工厂里的代码即可,用户端始终是使用接口来得到对应工厂,他们并不知道得到的对象是什么类型(因为接收对象是接口声明)),同时,用这个模式创建新产品很复杂(必须要扩展接口,且所有接口的改变,子类都必须要进行改变)
思考
抽象工厂定义一组接口,每个接口返回的对象需要是有关联的(BollyMovie和TollyMoive),然后实现这个接口的所有工厂必须都能同时生产(创建)这些相关联的对象。感觉要用这个模式,起码系统的抽象可以多层分类,然后将一种类别拿出来做抽象工厂接口,然后另一种分类(具体产品还要实现抽象工厂接口的返回值的接口类型)实现抽象工厂接口,这样可以得到有两种类别属性的对象