设计模式-工厂方法(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
    '单机按钮
    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
    ‘单机按钮加一个
    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>

效果图

好处、两张图带

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

用设计模式之后的、只要知道工厂类就行了、与食物类解耦和、扩展的话就加一个食物类加一个工厂类、客户端调用就行

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

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

————chenchen————

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

时间: 2024-12-29 11:18:47

设计模式-工厂方法(Demo)的相关文章

Python设计模式——工厂方法模式(FactoryMethod)

需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = '[email protected]' class LeiFeng(): def buy_rice(self): pass def sweep(self): pass class Student(LeiFeng): def buy_rice(self): print '大学生帮你买米' def sweep(self

设计模式——工厂方法

目的 定义创建对象的方法/接口,然后让子类来决定创建具体的类的对象. 通过不同的类,使得实例化延迟至子类. 特点 必须引入继承,才能算是工厂方法模式. Found in JDK API java.util.Calendar#getInstance()java.text.NumberFormat#getInstance() java.lang.StringBuffer, java.lang.StringBuilder(继承自 AbstractStringBuilder) 变种 工厂方法是抽象的:

php设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 <?php 2 /* 3 * php设计模式——工厂方法模式(Factory Method) 4 */ 5 6 7 /* 8 * IAp

Android设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

4. 星际争霸之php设计模式--工厂方法模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248177.html============================================

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. 该场景相应的UML图例如以下所看到的: 图1:简单工厂模式UML图 简单工厂模式的參与者: 工厂(Factory)角色:接受client的请求,通过请求负责创建对应的产品对象. 抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共有的接口.但是抽象类或接口. 详细产品

Java设计模式—工厂方法模式&amp;抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义:Creator为抽象创建 类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的. 工厂方法模式的扩展方式有很多种,下边是工厂方法模式一个比较实用的源代码: 抽象产品类: pub

java语言实现创建型设计模式—工厂方法模式

一.描述 基于简单工厂模式中将所有类的创建和初始化放在一个工厂类中出现的问题,我们引进了工厂方法模式,该模式是GoF总结的23种设计模式的第一种,这个设计模式将一个工厂类拆分成多个具体的工厂类,每个具体的工厂类负责相应的类的对象的创建. 在工厂方法模式中,抽象工厂类负责定义创建对象的接口,具体对象的创建由实现该抽象工厂的具体工厂类来完成,它由四部分组成:抽象工厂类.实现抽象工厂类的具体工厂类.抽象类.实现抽象类的具体类. 二.工厂方法模式的优缺点 优点:在工厂方法模式中,创建对象的任务由具体的工