设计模式-工厂方法(Demo)


工厂方法


          工厂方法跟简单工厂一样、都是创建型的设计模式、他攻克了简单工厂的违背开放封闭的缺点。


故事

          主人……人家做饭好累的、女仆抱着我大腿说着、自从上次把她买进家、没做了几次饭就喊累……看着她那出处可怜的眼神、罢了、再招几个女仆吧、话说还没给第一个女仆起名字、就叫‘遥’吧、后来又招了‘媛’和‘悦’、然后让她们分别仅仅做一道菜、遥做牛排、媛做红酒、悦做意大利面、这次每次我想吃牛排就直接跟遥说‘吃饭’,喝红酒就跟媛说‘吃饭’而不用说吃什么了、由于她们每一个人仅仅做一道菜、以后要再想吃别的、就再招个女仆、仅仅做一道菜、也不影响现有的女仆、这样她们也不会抱怨喽、美女围绕、喝酒吃肉、神仙快活——


------UML图

        如图所看到的、原先的女仆工厂换成了女仆接口、然后有特定的女仆去做个个食物、这种优点就是、假设在加一个食物、仅仅要再加一个女仆工厂、再加个食物类即可了、不违背开放封闭原则、不像简单工厂还要改动工厂类。



代码

<span style="font-size:18px;">Public Class Form1
    '女仆接口
    Public Interface IMaid
        Function IMakeFood() As Food '做食物的方法
    End Interface
    '女仆遥
    Public Class YAO : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New Beef '返回牛排实例化的类
        End Function
    End Class
    '女仆媛
    Public Class yuan : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New RedWine '返回红酒实例化的类
        End Function
    End Class
    '女仆悦
    Public Class yue : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New Noodles '返回意大利面实例化的类
        End Function
    End Class

    Public MustInherit Class Food '抽象食物类

        Overridable Function Edible() As String '被食用的方法

        End Function
    End Class
    Public Class Beef : Inherits Food '牛排类

        Overrides Function Edible() As String
            Dim str As String
            str = "牛排:我被吃掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class
    Public Class RedWine : Inherits Food '红酒类

        Overrides Function Edible() As String
            Dim str As String
            str = "红酒:我被喝掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class
    Public Class Noodles : Inherits Food '红酒类
        Overrides Function Edible() As String
            Dim str As String
            str = "意大利面:我被我吃掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class
    '单机button
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim YAO As IMaid = New YAO '声明女仆实例化遥

        Label1.Text = YAO.IMakeFood().Edible() '遥做牛排
        
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim yuan As IMaid = New yuan '声明女仆实例化媛
        Label1.Text = yuan.IMakeFood().Edible() '媛做牛排

    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim yue As IMaid = New yue '声明女仆实例化悦
        Label1.Text = yue.IMakeFood().Edible() '悦做牛排
    End Sub
End Class

</span>




实际效果




扩展

           再加一个女仆樱类、加一个披萨食物类

<span style="font-size:18px;">    Public Class pizz : Inherits Food '披萨

        Overrides Function Edible() As String
            Dim str As String
            str = "披萨:我被吃掉~\(≧▽≦)/~啦啦啦"
            Return str
        End Function

    End Class

    '女仆樱
    Public Class ying : Implements IMaid
        Public Function IMakeFood() As Food Implements IMaid.IMakeFood
            Return New pizz '返回披萨实例化的类
        End Function
    End Class
    ‘单机button加一个
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim ying As IMaid = New ying '声明女仆实例化樱
        Label1.Text = ying.IMakeFood().Edible() '樱做披萨
    End Sub
</span>


效果图






优点、两张图带


用设计模式之前的多对多关系、假设在加一个食物、你我他三个类都要做更改





        用设计模式之后的、仅仅要知道工厂类即可了、与食物类解耦和、扩展的话就加一个食物类加一个工厂类、client调用即可






—————————————————够明显了吧—————————————————


——————————工厂方法——————————


————chenchen————

转载于:https://www.cnblogs.com/lcchuguo/p/5347358.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个使用 C 语言实现面向对象的工厂方法模式的简单示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct Product Product; struct Product { void (*use)(Product*); }; typedef struct ConcreteProductA ConcreteProductA; struct ConcreteProductA { Product product; int concrete_a_data; }; void concrete_product_a_use(Product* product) { ConcreteProductA* concrete_product_a = (ConcreteProductA*) product; printf("ConcreteProductA use, concrete_a_data = %d\n", concrete_product_a->concrete_a_data); } typedef struct ConcreteProductB ConcreteProductB; struct ConcreteProductB { Product product; int concrete_b_data; }; void concrete_product_b_use(Product* product) { ConcreteProductB* concrete_product_b = (ConcreteProductB*) product; printf("ConcreteProductB use, concrete_b_data = %d\n", concrete_product_b->concrete_b_data); } typedef struct Creator Creator; struct Creator { Product* (*factory_method)(); }; typedef struct ConcreteCreatorA ConcreteCreatorA; struct ConcreteCreatorA { Creator creator; }; Product* concrete_creator_a_factory_method() { ConcreteProductA* concrete_product_a = (ConcreteProductA*) malloc(sizeof(ConcreteProductA)); concrete_product_a->product.use = concrete_product_a_use; concrete_product_a->concrete_a_data = rand() % 100; return (Product*) concrete_product_a; } typedef struct ConcreteCreatorB ConcreteCreatorB; struct ConcreteCreatorB { Creator creator; }; Product* concrete_creator_b_factory_method() { ConcreteProductB* concrete_product_b = (ConcreteProductB*) malloc(sizeof(ConcreteProductB)); concrete_product_b->product.use = concrete_product_b_use; concrete_product_b->concrete_b_data = rand() % 100; return (Product*) concrete_product_b; } int main() { Creator* creator = (Creator*) malloc(sizeof(ConcreteCreatorA)); creator->factory_method = concrete_creator_a_factory_method; Product* product = creator->factory_method(); product->use(product); free(product); creator = (Creator*) malloc(sizeof(ConcreteCreatorB)); creator->factory_method = concrete_creator_b_factory_method; product = creator->factory_method(); product->use(product); free(product); free(creator); ### 回答2: 面向对象的工厂方法模式是一种创建型设计模式,它将对象的创建委托给工厂类,实现了对象的创建与使用的分离,可以灵活地添加新的产品类型而无需修改客户端代码。 以一个简单的图形绘制工具为例,我们可以使用工厂方法模式实现对不同图形对象的创建。 首先,我们定义一个抽象的图形类,包含绘制方法draw(): class Shape { public abstract void draw(); } 然后,定义不同的具体图形类,继承自抽象图形类: class Rectangle extends Shape { public void draw() { // 绘制矩形的具体实现 } } class Circle extends Shape { public void draw() { // 绘制圆形的具体实现 } } 接下来,我们定义一个抽象的图形工厂类,包含创建图形对象的方法createShape(): class ShapeFactory { public abstract Shape createShape(); } 然后,定义不同的具体图形工厂类,继承自抽象图形工厂类: class RectangleFactory extends ShapeFactory { public Shape createShape() { return new Rectangle(); } } class CircleFactory extends ShapeFactory { public Shape createShape() { return new Circle(); } } 最后,我们可以在客户端代码中通过具体的工厂类创建具体的图形对象并调用相应的方法: ShapeFactory factory = new RectangleFactory(); Shape shape = factory.createShape(); shape.draw(); 这样,通过工厂方法模式,我们可以实现对不同图形对象的创建和使用的解耦,从而提高了系统的扩展性和灵活性。 ### 回答3: 工厂方法模式是一种创建型设计模式,用于解耦具体对象的创建和使用。在面向对象的编程中,通常需要通过实例化具体的对象来完成某个功能,这会导致代码耦合度高、可维护性差。而工厂方法模式通过定义一个抽象工厂类,让子类具体实现创建对象的方法,以达到解耦的效果。 下面以一个计算器为例来演示工厂方法模式的使用。 首先,我们定义一个抽象的计算器接口Calculator,其中包含了两个方法:add和subtract。 接着,我们创建两个具体类CalculatorAdd和CalculatorSubtract,它们分别实现了Calculator接口,并分别实现了add和subtract方法,用于进行加法和减法运算。 然后,我们创建一个抽象工厂类CalculatorFactory,其中包含一个创建计算器的抽象方法createCalculator。 最后,我们创建两个具体工厂类CalculatorAddFactory和CalculatorSubtractFactory,它们分别实现了CalculatorFactory接口,并实现了createCalculator方法,分别用来创建加法计算器和减法计算器的对象。 这样,当我们需要使用计算器时,只需通过具体工厂类创建对应的计算器对象,并直接使用其方法进行计算,无需关心具体对象的创建细节。 工厂方法模式可以将对象的创建和使用分离开来,提高代码的可维护性和可扩展性。当需要新增一种计算器时,只需创建一个新的具体工厂类和计算器类,并通过扩展抽象工厂类和接口来完成,无需修改已有的代码。同时,也方便进行单元测试和代码的复用。 总之,工厂方法模式是一种常用的设计模式,在面向对象的编程中具有重要的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值