首页 > 其他分享 >设计模式(三)抽象工厂

设计模式(三)抽象工厂

时间:2023-08-24 12:26:32浏览次数:26  
标签:void Display 抽象 产品 工厂 设计模式 public

一、定义

提供一个创建一系列相关或互相依赖对象的接口,而无须指定他们具体的类,抽象工厂模式是一种创建型模式。

二、描述

抽象工厂比工厂方法的抽象程度更高,通过引入了工厂等级结构,解决了简单工厂模式中工厂类职责太重的原则。为了更好的理解抽象工厂模式,引入两个概念:
1、产品等级结构:指不同品牌的同一类型产品,如:小米电视机、海信电视机、索尼电视机
2、产品族:指同一品牌的不同了类型产品,如:小米电视机、小米手机、小米电脑
抽象工厂模式中的每个具体工厂提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族,它包含以下四个角色:
1、AbstractFactory (抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
2、ConcreteFactory (具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
3、AbstractProduct (抽象产品角色):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
4、ConcreteProduct (具体产品角色):它定义具体工厂生产的具体产品对象,实现在抽象产品接口中声明的业务方法。

三、例子

X公司要开发一套皮肤库,可切换不同风格,如春天风格,用浅绿色按钮、文本框等,夏天用浅蓝色的,后续还可以增加其他风格。
抽象产品接口:Button、TextField、ComboBox

public interface IButton
{
    void Display();
}

public interface ITextField
{
    void Display();
}

public interface IComboBox
{
    void Display();
}

具体产品类:
SpringButton、SpringTextField、SpringComboBox,Spring风格按钮、文本框、组合框
SummerButton、SummerTextField、SummerComboBox,Summer风格按钮、文本框、组合框

public class SpringButton : IButton
{
    public void Display()
    {
        Console.WriteLine("显示浅绿色按钮。");
    }
}

public class SpringTextField : ITextField
{
    public void Display()
    {
        Console.WriteLine("显示绿色边框文本框。");
    }
}

public class SpringComboBox : IComboBox
{
    public void Display()
    {
        Console.WriteLine("显示绿色边框下拉框。");
    }
}

public class SummerButton : IButton
{
    public void Display()
    {
        Console.WriteLine("显示浅绿色按钮。");
    }
}

public class SummerTextField : ITextField
{
    public void Display()
    {
        Console.WriteLine("显示绿色边框文本框。");
    }
}

public class SummerComboBox : IComboBox
{
    public void Display()
    {
        Console.WriteLine("显示绿色边框下拉框。");
    }
}

抽象皮肤工厂接口:ISkinFactory

public interface ISkinFactory
{
    IButton CreateButton();
    ITextField CreateTextField();
    IComboBox CreateComboBox();
}

具体皮肤工厂类:SpringSkinFactory、SummerSkinFactory

public class SpringSkinFactory : ISkinFactory
{
    public IButton CreateButton()
    {
        return new SpringButton();
    }

    public IComboBox CreateComboBox()
    {
        return new SpringComboBox();
    }

    public ITextField CreateTextField()
    {
        return new SpringTextField();
    }
}

public class SummerSkinFactory : ISkinFactory
{
    public IButton CreateButton()
    {
        return new SummerButton();
    }

    public IComboBox CreateComboBox()
    {
        return new SummerComboBox();
    }

    public ITextField CreateTextField()
    {
        return new SummerTextField();
    }
}

Program:测试代码

Console.WriteLine("加载Spring皮肤\n");

ISkinFactory skinFactory = new SpringSkinFactory();

IButton button = skinFactory.CreateButton();
ITextField textField = skinFactory.CreateTextField();
IComboBox comboBox = skinFactory.CreateComboBox();

button.Display();
textField.Display();
comboBox.Display();

Console.ReadLine();

四、总结

如果需要增加新的产品族很方便,无需修改已有系统,符合开闭原则,但是如果需要增加产品等级结构,会非常麻烦,比如单选按钮(RadioButton),因为抽象工厂ISkinFactory根本没有提供创建的方法,需要依次修改抽象工厂接口、具体皮肤工厂类,抽象工厂模式无法很好的解决此类问题,这也是该模式最大的缺点,所以不适合在产品等级结构不稳定的场景下使用。

标签:void,Display,抽象,产品,工厂,设计模式,public
From: https://www.cnblogs.com/WinterSir/p/16727752.html

相关文章

  • 抽象类
    抽象类publicabstractclassAction{​  //约束~有人帮吗实现  //abstract,抽象方法,只有方法名字,没有方法实现!  publicabstractvoiddoSomething();​  //1.不能new这个抽象类,只能靠子类去实现它:约束!  //2.抽象类中可以写普通方法~  //3.抽象方......
  • swift--控件工厂类的实现
    控件工厂类,简而言之就是,减少代码的复用率,只在哪里用,然后在哪里调:代码如下:importUIKitclassViewFactory:UIView,UITextFieldDelegate{//默认控件的尺寸classfuncgetDefaultFrame()->CGRect{letdefaultFrame=CGRect(x:0,y:0,width:100,height......
  • 设计模式和七大原则概述及单一职责原则详解
    设计模式的目的编写软件过程中,程序员面临着来自,耦合性,内聚性以及可维护性,扩展性,重用性等方面的挑战。设计模式是为了让程序,具有更好的1.代码重用性(相同代码,不用重复编写)2.可读性(编程规范性,便于其他程序员的阅读和理解)3.可扩展性(当需要增加新的功能时,非常的方便)4.可靠......
  • 【Java设计模式005】代理模式
    概述大家好,个人gzh是大猪和小猪的小家,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!由于一些特定原因某些对象不适合或者不能直接引用目标对象,这时就可以使用代理模式。代理模式为目标对象提供一个代理以......
  • 智能注塑机挤塑机工厂车间数据采集联网设备信息
    立式双色机百赞塑料机械F170F3-2C1不详I/O采集立式注塑机 东莞大禹机械 双色TY850-2R-2C 1 宏讯AK668N 智能网关立式转盘机 杭州大禹机械 HY7002RS 1 盟立 串口 智能网关立式转盘机 余姚今机机械 KT-300 1 宝捷信PS630BM 串口 智能网关卧式双色注塑机 宁波富强鑫 双色FB-2......
  • 复杂工厂模式
    目录前言导语代码部分前言我是歌谣歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语复杂工厂模式编辑代码部分```//第一步定义自行车的构造函数两个属性一个name和一个方法methodvarBicycleShop=function(name){this.name=name;this.method=function(){return......
  • 设计模式分类
    博客地址:https://www.cnblogs.com/zylyehuo/......
  • 设计模式-单例模式
    饿汉式/***饿汉式,类加载的时候就会初始化**问题:*1.通过反射可以破坏单例*2.通过反序列化破坏单例*3.通过Unsafe破坏单例,无法解决**@author:optimjie*@date:2023-08-1921:37*/publicclassSingleton1{privateSingleton1()......
  • 2-14-Gateway网关-路由断言工厂[15-Gateway网关-路由的过滤器配置]
    所谓的断言工厂与过滤器都是通过yml配置生效以下都将从配置的角度说明如何配置具体哪一个怎么用可以直接访问spring官网查看spring:cloud:gateway:routes:-id:user-serviceuri:lb://userservicepredicates:-Path=/us......
  • 设计模式串讲
    BehavioralDesignPatterns行为模式行为模式负责对象之间的高效沟通和职责委派,这些模式刻画了运行时难以跟踪的复杂控制流,从而把开发者的注意力从控制流转移到对象间的联系方式上。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。行为类模式使用继承机制在类间分派......