其他分享
首页 > 其他分享> > 抽象工厂模式

抽象工厂模式

作者:互联网

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

  1. 如果系统不关心它的产品是怎么创建或者组合的,可以使用这个模式
  2. 当处理多个工厂的时候可以使用这个模式
  3. 这个模式将所有具体类分离,让改变产品的过程变得很容易(改工厂里的代码即可,用户端始终是使用接口来得到对应工厂,他们并不知道得到的对象是什么类型(因为接收对象是接口声明)),同时,用这个模式创建新产品很复杂(必须要扩展接口,且所有接口的改变,子类都必须要进行改变)

思考

抽象工厂定义一组接口,每个接口返回的对象需要是有关联的(BollyMovie和TollyMoive),然后实现这个接口的所有工厂必须都能同时生产(创建)这些相关联的对象。感觉要用这个模式,起码系统的抽象可以多层分类,然后将一种类别拿出来做抽象工厂接口,然后另一种分类(具体产品还要实现抽象工厂接口的返回值的接口类型)实现抽象工厂接口,这样可以得到有两种类别属性的对象

标签:return,接口,工厂,抽象,模式,Override,IBollyWoodMovie,movieName,public
来源: https://www.cnblogs.com/mouseGo/p/14106317.html