首页 > 其他分享 >2) Abstract Factory Pattern

2) Abstract Factory Pattern

时间:2023-06-06 13:36:19浏览次数:37  
标签:Box Pattern Abstract Factory Button paint Override new public

类别:

 Creational Pattern

问题/动机:

如何创建一套父类的问题

情形一:混淆,且不能察觉

    // 下面这个方法本来是要建造一辆宝马汽车,但是因为零部件太多,粗心大意误用了奔驰的零件。
    public Car createBMWCar(){
        Part1 p1 = new com.bmw.Part1();
        [...]
        Part10000 p10000 = new com.benz.Part10000();
        [...]
    }

情形二:可完全避免混淆问题

import com.bmw.BMWFactory;
    [...]
    // 下面使用的是一个工厂,因为只引用了宝马工厂,所以不能可能出现奔驰的零件。
    public Car createBMWCar(){
        Part1 p1 = BMWFactory.getPart1();
        [...]
        Part10000 p10000 = BMWFactory.getPart10000();
        [...]
    }

 

方案:

https://en.wikipedia.org/wiki/Abstract_factory_pattern

 

示例:

 

public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {

        GUIFactory guiFactory;
        Box box;
        Button button;

        // situation one:
        guiFactory = new WinFactory();
        box = guiFactory.createBox();
        box.paint();
        button = guiFactory.createButton();
        button.paint();

        // situation two:
        guiFactory = new MacOSFactory();
        box = guiFactory.createBox();
        box.paint();
        button = guiFactory.createButton();
        button.paint();
    }

}

// GUI Graphical User Interface
// https://docs.unity3d.com/ScriptReference/GUI.Button.html
// https://docs.unity3d.com/ScriptReference/GUI.Box.html

interface Button {
    void paint();
}

interface Box {
    void paint();
}

interface GUIFactory {
    public Button createButton();

    public Box createBox();
}

class WinFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WinButton();
    }

    @Override
    public Box createBox() {
        return new WinBox();
    }
}

class MacOSFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacOSButton();
    }

    @Override
    public Box createBox() {
        return new MacOSBox();
    }
}

class WinButton implements Button {
    @Override
    public void paint() {
        System.out.println("WinButton");
    }
}

class MacOSButton implements Button {
    @Override
    public void paint() {
        System.out.println("macOS button");
    }
}

class WinBox implements Box {
    @Override
    public void paint() {
        System.out.println("WinBox");
    }
}

class MacOSBox implements Box {
    @Override
    public void paint() {
        System.out.println("macOS box");
    }
}

 

WinBox
WinButton
macOS box
macOS button

 

分析:

抽象工厂模式具备工厂模式的所有优缺点

额外的,依据不同环境得到具体工厂,代码持有父接口(向上转型),可通过注入获得具体工厂类而代码无需变动

不足:(

 如果抽象类需要做改动,牵扯到所有子类

优化:)

 无

应用:

标签:Box,Pattern,Abstract,Factory,Button,paint,Override,new,public
From: https://www.cnblogs.com/zno2/p/6694798.html

相关文章

  • 1) Factory method pattern
    类别: CreationalPattern问题/动机如何创建一套子类的问题(父类引用指向子类实例)情形1:一个方法返回一个具体的子类极端情况:1万个子类需要一万个方法吗极端情况:如过再扩展一万个子类,还需要再增加一万个方法吗极端情况:虽然有一万个子类,但只需要用到其中一个,其他9999个干陪着......
  • 9) Composite Pattern
    类别: StructualPattern问题: 方案:   示例: importjava.util.ArrayList;importjava.util.List;publicclassCompositePatternDemo{publicstaticvoidmain(String[]args){Bodysun=newBody("太阳","恒星",1392000000);......
  • 8) Filter/Criteria Pattern
    类别: StructualPattern问题: 方案:   示例: importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjava.util.Set;publicclassCriteriaPatternDemo{publicstaticvoidmain(String[]args){List<Person>p......
  • 7) Bridge Pattern
    类别: StructuralPatterns问题:连连看的问题 不使用桥接,要写81个类,使用桥接,只需要18个类方案: 示例: publicclassBridgePatternDemo{publicstaticvoidmain(String[]args){Somebodysb=newXiaohong(newBanana());sb.eat();......
  • 6) Adapter Pattern
    类别: StructuralPattern问题:什么是接口?按照标准提供服务,其他想要使用该接口的要按照该标准接入服务什么是依赖?持有目标对象,拥有使用权(AuseB)数据线?数据线按USB标准接入充电宝,通过lightning提供充电服务手机?通过lightning标准接入数据线  客户端因种种限制只能接入......
  • 10) Decorator Pattern
    类别: StructuralPattern问题: 在不改变接口的前提下增加额外的服务方案:   示例:publicclassDecoratorPatternDemo{publicstaticvoidmain(String[]args){Shapecircle=newCircle();ShaperedCircle=newRedShapeDecorator(newC......
  • 类GeometricShapeFactory-JTS几何图形绘制API
    org.locationtech.jts.util类GeometricShapeFactoryjava.lang.Objectorg.locationtech.jts.util.GeometricShapeFactory直接已知子类:正弦之星工厂公共类GeometricShapeFactory扩展Object计算各种常见的几何形状。提供各种方法来指定所生成形状的位置,范围和旋转,以及用于形成它们......
  • cpp: Bridge Pattern
     /*****************************************************************//***\fileGold.h*\brief桥接模式BridgePatternC++14*2023年6月3日涂聚文GeovinDuVisualStudio2022edit.*\authorgeovindu*\dateJune2023***********************......
  • spring cloud gateway 自定义GatewayFilterFactory
    官网地址:https://docs.spring.io/spring-cloud-gateway/docs/2.2.9.RELEASE/reference/html/#writing-custom-route-predicate-factories参考地址:https://blog.csdn.net/myli92/article/details/127328893importcom.ruoyi.common.core.utils.StringUtils;importorg.springfr......
  • 制品库 Jfrog Artifactory 搭建私服
    1.JfrogArtifactory概述JFrogArtifactory功能最强大的二进制制品仓库。在Google、Apple、思科、甲骨文、华为、腾讯等众多世界500强公司中都有大规模使用,在二进制软件制品管理领域处于绝对领先地位。与其他服务不同,JJFrogArtifactory在版本发行上分类较多且杂。https://www......