设计模式之抽象工厂模式

2019-08-02 15:35:39 浏览数 (1)

什么是抽象工厂模式?

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式使用场景

在生活中,我们经常去餐馆吃饭。比如,我们愿意吃鸡腿配上可乐,喜欢吃盖饭配蛋花汤。我们不关心鸡腿怎么做的,可乐怎么生产的,盖饭怎么炒的,而只关心我们吃什么,喝什么,我们只需要指定想要的搭配就可以了,这就是典型的抽象工厂。 后面会代码举例这个抽象工厂模式场景。

总结抽象工厂使用场景:

 1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。

 2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。

 3 强调的对象的组合结果,而不是他们具体的接口和实现。

抽象工厂模式意图

提供对象的使用接口,隐藏对象的创建过程。

抽象工厂模式角色

代码语言:javascript复制
AbstractFactory 提供创建对象的接口。ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。AbstractProduct 提供对象的使用接口。ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。

抽象工厂模式代码举例

抽象接口定义:

代码语言:javascript复制
//抽象工厂-提供创建对象接口----主食 饮品 的抽象接口
public interface EatFacotry {
    
     public StapleFood MakeStapleFood();
        
     
     public Drinks MakeDrinks();

}

//主食接口--提供对象的使用接口
interface  StapleFood{
    
     public void eating();
}


//饮用接口--提供对象的使用接口
interface  Drinks{
    
     public void drinking();
    
}

创建真实的对象 工厂会隐藏他们的创建过程,就像我们只想吃 鸡腿 可乐 而不关系他们的制作过程一样:

代码语言:javascript复制
//创建主食--鸡腿
class Drumsticks implements StapleFood{

    public void eating() {
        // TODO Auto-generated method stub
        System.out.println("主食吃 鸡腿 鸡腿  鸡腿");
    }
    
}

//创建主食--盖饭
class Rice implements StapleFood{

    public void eating() {
        // TODO Auto-generated method stub
        System.out.println("主食吃 盖饭 盖饭 盖饭");
    }
    
}


//创建主饮品--可乐
class Cola implements Drinks{

    public void drinking() {
        // TODO Auto-generated method stub
        System.out.println("可乐 可乐  可乐 可乐");
    }

    
    
}

//创建主饮品--鸡蛋汤
class EggdropSoup implements Drinks{

    public void drinking() {
        // TODO Auto-generated method stub
        System.out.println(" 鸡蛋汤 鸡蛋汤 鸡蛋汤 鸡蛋汤");
    }
    
}

提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。 创建 鸡腿 可乐

代码语言:javascript复制
什么是抽象工厂模式?
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。



在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式使用场景
在生活中,我们经常去餐馆吃饭。比如,我们愿意吃鸡腿配上可乐,喜欢吃盖饭配蛋花汤。我们不关心鸡腿怎么做的,可乐怎么生产的,盖饭怎么炒的,而只关心我们吃什么,喝什么,我们只需要指定想要的搭配就可以了,这就是典型的抽象工厂。 后面会代码举例这个抽象工厂模式场景。



总结抽象工厂使用场景:

 1 系统独立于它的产品创建、组合和表示。即无需关心内部对象时如何创建的,怎么创建的,什么含义。

 2 系统需要多个产品组合中的一个配置。由于对象很多,能够组合出的组合非常多,而系统只是使用某一个组合。

 3 强调的对象的组合结果,而不是他们具体的接口和实现。

抽象工厂模式意图
提供对象的使用接口,隐藏对象的创建过程。

抽象工厂模式角色
AbstractFactory 提供创建对象的接口。

ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。

AbstractProduct 提供对象的使用接口。

ConcreteProduct 提供真正的适用对象,隐藏该对象的创建过程,是工厂创建的对象。

Client 使用者,通过抽象工厂接口,使用不同的具体工厂方法创建对象组合,从而直接使用对象,无需关注对象的创建过程。
抽象工厂模式代码举例
抽象接口定义:

//抽象工厂-提供创建对象接口----主食 饮品 的抽象接口
public interface EatFacotry {
    
     public StapleFood MakeStapleFood();
        
     
     public Drinks MakeDrinks();

}

//主食接口--提供对象的使用接口
interface  StapleFood{
    
     public void eating();
}


//饮用接口--提供对象的使用接口
interface  Drinks{
    
     public void drinking();
    
}
创建真实的对象 工厂会隐藏他们的创建过程,就像我们只想吃 鸡腿 可乐 而不关系他们的制作过程一样:

//创建主食--鸡腿
class Drumsticks implements StapleFood{

    public void eating() {
        // TODO Auto-generated method stub
        System.out.println("主食吃 鸡腿 鸡腿  鸡腿");
    }
    
}

//创建主食--盖饭
class Rice implements StapleFood{

    public void eating() {
        // TODO Auto-generated method stub
        System.out.println("主食吃 盖饭 盖饭 盖饭");
    }
    
}


//创建主饮品--可乐
class Cola implements Drinks{

    public void drinking() {
        // TODO Auto-generated method stub
        System.out.println("可乐 可乐  可乐 可乐");
    }

    
    
}

//创建主饮品--鸡蛋汤
class EggdropSoup implements Drinks{

    public void drinking() {
        // TODO Auto-generated method stub
        System.out.println(" 鸡蛋汤 鸡蛋汤 鸡蛋汤 鸡蛋汤");
    }
    
}
提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。  创建 鸡腿 可乐

class ConcreteFactory1 implements EatFacotry{

    //创建 主食 鸡腿
    public StapleFood MakeStapleFood() {
        // TODO Auto-generated method stub
        return new Drumsticks();
    }

    //创建 饮品  可乐
    public Drinks MakeDrinks() {
        // TODO Auto-generated method stub
        return new Cola();
    }
}
//提供真正创建对象的实现类,用于组合并创建不同的对象,实现一个产品族。  创建 盖饭 鸡蛋汤
class ConcreteFactory2 implements EatFacotry{

    public StapleFood MakeStapleFood() {
        // TODO Auto-generated method stub
        return new Rice();
    }

    public Drinks MakeDrinks() {
        // TODO Auto-generated method stub
        return new EggdropSoup();
    }

 

}
下面看下如何使用

public static void main(String[] args) {

        //---------------鸡腿 可乐---------------
        
        EatFacotry eat1 =new  ConcreteFactory2();
        
        eat1.MakeStapleFood().eating();
        
        eat1.MakeDrinks().drinking();

    }
这就是一个简单的抽象工厂的使用。

下面看下如何使用

代码语言:javascript复制
public static void main(String[] args) {

        //---------------鸡腿 可乐---------------
        
        EatFacotry eat1 =new  ConcreteFactory2();
        
        eat1.MakeStapleFood().eating();
        
        eat1.MakeDrinks().drinking();

    }

这就是一个简单的抽象工厂的使用。

0 人点赞