抽象工厂模式

Posted glsy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象工厂模式相关的知识,希望对你有一定的参考价值。

一、模式名

抽象工厂, Abstract Factory

二、解决的问题

抽象工厂由“抽象”和"工厂"两个词组成,前者代表了使用了抽象类,后者代表了实现了工厂组装零件的模式。都知道,工厂完成零部件的生产后,再组装成对应的产品,抽象工厂正是实现了这个过程。

抽象工厂用于存在大量可拓展组件,并需要组装这些组件的场景。

三、解决方案

抽象工厂模式的UML图如下所示。

技术图片

代码如下:

public class AbstractFactoryExer 
    public static void main(String[] args) 
        AbstractPhoneFactory factory = AbstractPhoneFactory.getFactory(2);
        AbstractCamera camera = factory.createCamera();
        AbstractMicrophone microphone = factory.createMicrophone();
        AbstractScreen screen = factory.createScreen();

        screen.show();
        microphone.talk();
        camera.photo();
    


// 摄像头抽象类
abstract class AbstractCamera 
    abstract void photo();


// 屏幕抽象类
abstract class AbstractScreen 
    abstract void show();


// 麦克风抽象类
abstract class AbstractMicrophone 
    abstract void talk();


// 抽象工厂抽象类
abstract class AbstractPhoneFactory 
    abstract AbstractCamera createCamera();
    abstract AbstractScreen createScreen();
    abstract AbstractMicrophone createMicrophone();
    // 获取工厂
    static AbstractPhoneFactory getFactory(int type) 
        if (type == 0) 
            return new Huawei();
         else if (type == 1) 
            return new Xiaomi();
         else 
            return new Apple();
        
    


class SonyCamera extends AbstractCamera 
    @Override
    void photo() 
        System.out.println("photo by sony camera");
    


class LeicaCamera extends AbstractCamera 
    @Override
    void photo() 
        System.out.println("photo by leica camera");
    


class CanonCamera extends AbstractCamera 
    @Override
    void photo() 
        System.out.println("photo by canon camera");
    


class KangningScreen extends AbstractScreen 
    @Override
    void show() 
        System.out.println("kangning show");
    


class JDFScreen extends AbstractScreen 
    @Override
    void show() 
        System.out.println("jdf show");
    


class SharpScreen extends AbstractScreen 
    @Override
    void show() 
        System.out.println("sharp show");
    


class NingdeMicrophone extends AbstractMicrophone 
    @Override
    void talk() 
        System.out.println("ningde talk");
    


class LenovoMicrophone extends AbstractMicrophone 
    @Override
    void talk() 
        System.out.println("lenovo talk");
    


class FeTriangleMicrophone extends AbstractMicrophone 
    @Override
    void talk() 
        System.out.println("fetriangle talk");
    


class Huawei extends AbstractPhoneFactory 

    public Huawei() 
        System.out.println("huawei");
    

    @Override
    AbstractCamera createCamera() 
        return new LeicaCamera();
    

    @Override
    AbstractScreen createScreen() 
        return new SharpScreen();
    

    @Override
    AbstractMicrophone createMicrophone() 
        return new NingdeMicrophone();
    


class Xiaomi extends AbstractPhoneFactory 

    public Xiaomi() 
        System.out.println("xiaomi");
    

    @Override
    AbstractCamera createCamera() 
        return new SonyCamera();
    

    @Override
    AbstractScreen createScreen() 
        return new JDFScreen();
    

    @Override
    AbstractMicrophone createMicrophone() 
        return new FeTriangleMicrophone();
    


class Apple extends AbstractPhoneFactory 

    public Apple () 
        System.out.println("apple");
    

    @Override
    AbstractCamera createCamera() 
        return new CanonCamera();
    

    @Override
    AbstractScreen createScreen() 
        return new SharpScreen();
    

    @Override
    AbstractMicrophone createMicrophone() 
        return new FeTriangleMicrophone();
    

抽象工厂模式在某些形式上和工厂方法模式很像,但是工厂方法模式只用于存在一组产品的情况,本质上不太符合工厂的特点,一般的工厂都会生产不止一组产品,一般都会有多种产品,所以提出了抽象工厂模式。

抽象工厂模式可以用于存在多种产品的情景下,比如上面举的手机厂商的例子,像华为、小米、苹果等手机厂商,负责手机设计和组装的,涉及的手机零部件有很多,可能某些手机厂商会使用同一个下游公司的产品。这样使用抽象工厂模式,可以方便地构造新的工厂。

抽象工厂模式可以方便地新增工厂,但是如果需要新增产品,需要修改的地方会有很多。

常用场景:

1. 存在多种多组产品

以上是关于抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂模式+工厂方法模式+抽象工厂模式

java抽象工厂的使用意图是啥?

工厂模式抽象工厂模式策略模式

工厂模式 - 抽象工厂

设计模式——抽象工厂模式

设计模式之抽象工厂模式