工厂模式,简单工厂模式,抽象工厂模式

说到这几个工厂模式有很多相似之处又有不同。最重要的是掌握这种思想,在以后搭建项目架构或写一些功能,应用这些思想,让自己的程序更健壮,或者说当你看到别人写的程序应用到了这种思想能够快速理解。话不多说,咱们先从入门级的小案例讲起。

一.简单工厂模式

基本概念:简单工厂模式是由一个工厂类根据接受到的消息决定要创建哪一个类的对象实例。

优点:在客户端只需要告诉工厂类创建什么实例就行,而不要关注具体怎么创建,因为那个工厂类有相关逻辑。

缺点:当添加新产品就不得不修改工厂逻辑,当类型较多时,可能造成工厂逻辑比较复杂,不利于系统的扩展和维护,所以从工厂的角度来说简单工厂模式是不符合软件设计原则的开闭原则(对扩展开放,对修改关闭)。

我们通过教科书级别的例子辅助理解代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SimpleFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            FlyFactory flyFactory = new FlyFactory();
            flyFactory.GetFly("wuya").fly();
            flyFactory.GetFly("yingwu").fly();
            Console.ReadKey();
        }
    }
    public interface IFly
    {
        void fly(); //默认公用方法
    }

    public class Wuya : IFly
    {
        public void fly()
        {
            Console.WriteLine("我是一只黑呜呜的乌鸦鸟,我会飞!");
        }
    }
    public class YingWu : IFly
    {
        public void fly()
        {
            Console.WriteLine("我是一只美丽的鹦鹉鸟,我会飞!");
        }
    }
    public class FlyFactory //飞的工厂类
    {
        public IFly GetFly(string type)
        {
            if ("wuya" == type)
            {
                return new Wuya();
            }
            else if ("yingwu" == type)
            {
                return new YingWu();
            }
            else
            {
                return null;
            }

        }

    }
}

二.工厂模式
基本概念:定义一个创建对象的工厂接口,子类继承这个接口,让子类决定实例的创建。
优点:子类继承创建对象的接口,让子类决定具体实例化的对象,想要增加一个产品,只需要增加一个工厂类即可,克服了简单工厂所违背的的开闭原则的缺点,扩展性高,易于维护.
缺点:代码量会比简单工厂多了几行,对与一些稍微复杂的业务,种类太多不太适合。

我们通过教科书级别的例子辅助理解代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Factory
{
    class Program
    {
        static void Main(string[] args)
        {
            IFkyFactory wuYaFactory = new WuYaFatory();
            wuYaFactory.GetFly().fly();
            IFkyFactory yingWuFactory = new YingWuFactory();
            yingWuFactory.GetFly().fly();
            Console.ReadKey();
        }
    }
    public interface IFly
    {
        void fly();
    }
    public class Wuya : IFly
    {
        public void fly()
        {
            Console.WriteLine("我是一只乌鸦鸟,我会飞!");
        }
    }
    public class YingWu : IFly
    {
        public void fly()
        {
            Console.WriteLine("我是一只美丽的鹦鹉鸟,我会飞!");
        }
    }

    public interface IFkyFactory
    {
        IFly GetFly();
    }
    public class WuYaFatory : IFkyFactory
    {
        public IFly GetFly()
        {
            return new Wuya();
        }

    }
    public class YingWuFactory : IFkyFactory
    {
        public IFly GetFly()
        {
            return new YingWu();
        }
    }
}

三.抽象工厂模式
基本概念:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

优点: 具有 工厂模式解耦的特点,此外当一个产品族中的多个对象被设计在一起工作时,它能保证客户端始终只使用同一个产品族中的对象。工厂方法模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构,最主要的是可以在类的内部对产品族的关联关系进行定义和描述。

缺点:虽然满足各种软件设计原则的优点,但是代码相对会多一些。

代码帮助理解,我们通过生产苹果手机,华为手机的主板,屏幕的例子如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractFactoryDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            IMobileFactory huaWeiMobileA = new ProductHuaWeiMobile();
            Console.WriteLine("我是第一 一个华为手机,我拥有:"); //如果你想批量生产手机可以循环语句控制
            huaWeiMobileA.ProductMobileBoard().ProductMobileBoard();
            huaWeiMobileA.ProductMobileScreen().ProductMobileScreen();
            IMobileFactory appleMobileX = new ProductAppleMobile();
            Console.WriteLine("我是第一个苹果手机,我拥有:");
            appleMobileX.ProductMobileBoard().ProductMobileBoard();
            appleMobileX.ProductMobileScreen().ProductMobileScreen();
                Console.ReadKey();

        }
    }
    public interface IMobileScreen
    {
        void ProductMobileScreen(); //默认公用方法
    }
    public class AppleMobileScreen : IMobileScreen
    {
        public void ProductMobileScreen()
        {
            Console.WriteLine("苹果手机屏幕");
        }
    }
    public class HuaWeiMobileScreen : IMobileScreen
    {
        public void ProductMobileScreen()
        {
            Console.WriteLine("华为手机屏幕");
        }
    }
    public interface IMobileBoard
    {
        void ProductMobileBoard();
    }

    public class AppleMobileBoard : IMobileBoard
    {
        public void ProductMobileBoard()
        {
            Console.WriteLine("苹果手机主板");
        }
    }
    public class HuaWeiMobileBoard : IMobileBoard
    {
        public void ProductMobileBoard()
        {
            Console.WriteLine("华为手机主板");
        }
    }
    public interface IMobileFactory   //生产 手机的接口
    {
        IMobileScreen ProductMobileScreen();
        IMobileBoard ProductMobileBoard();

    }
    public class ProductHuaWeiMobile : IMobileFactory //生产华为手机的工厂类
    {
        public IMobileBoard ProductMobileBoard()
        {
            return new HuaWeiMobileBoard();
        }

        public IMobileScreen ProductMobileScreen()
        {
            return new HuaWeiMobileScreen();
        }
    }
    public class ProductAppleMobile:IMobileFactory//生产苹果手机的工厂类
    {
        public IMobileBoard ProductMobileBoard()
        {
            return new AppleMobileBoard();
        }

        public IMobileScreen ProductMobileScreen()
        {
            return new AppleMobileScreen();
        }
    }
}

总结:

朋友呀!如果看了代码还没理解这三种设计模式,建议先巩固一下C#中的面向对象中的多态,继承等基础知识或其它面向对象语言也可。这几个例子其实浅显易懂,只是让大家理解这种思想。在今后项目实战中能够应用使自己的程序更健壮,或见其他人项目中应用到了这种模式能够快速理解。

原文地址:https://www.cnblogs.com/zylstu/p/10027974.html

时间: 2024-10-04 07:07:42

工厂模式,简单工厂模式,抽象工厂模式的相关文章

设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 ? 一个系统要独立于它的产品的创建.组合和表示时. ? 一个系统要由多个产品系列中的一个来配置时. ? 当你要强调一系列相关的产品对象的设计以便进行联合使用时. ? 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 结构 模式结构图如下所示: Creator: 声明一个创建抽象产品对象的操作接口. ConcreteCreator:(Concrete

终极版:由简单工厂模式,升级到抽象工厂模式(用到反射)

前面两个已经学习简单三层到简单工厂模式的变化,但是简单工厂模式还是有个缺点,就是简单工厂中集合了所有的实例的创建.也不是很好. 现在想到使用抽象工厂的方式来实现这个: 我们在程序集中加上下面的代码: <appSettings> <!--命名空间--> <add key="DALNameSpace" value="DAL"/> <!--程序集--> <add key="DALAssembly"

工厂模式(Factory)和抽象工厂模式(Abstract Factory)

一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.                (2)实例:    抽象产品类 1 public abstract class ProductNoodle { 2 public abstract String description(); 3 } 具体产品类 1 public class ConcreteNoodleA e

java进阶之工厂模式(二)抽象工厂模式

public interface KitchenFactory{ //抽象工厂 public Food getFood(); 抽象方法 public TableWare getTableWare(); } public interface Food{ //抽象食物 public String getFoodName(); } public interface TableWare{ public String getToolName(); //抽象餐具 } public class AKitche

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向

简单工厂模式 工厂模式 抽象工厂模式

其实这个三个C++的设计模式已经学习很长时间了,今晚才想起来要写这三个设计模式,为什么要用C++中的设计模式呢?for example,你已经会开车了,正着开,倒着开,转弯,这些都是开车基本的,但是你并没有很高的车技,并不会炫酷.漂移,就好像C++中的设计模式一样,在你学好C++的基础上,娴熟的应用出的新技能,能让你的车开的更好. 为什么要用简单工厂模式,记得上一次,我虽然敲完了代码,但是当别人突然问一句,你为什么要用简单工厂模式,我突然就愣住了,代码很简单,一看就懂了.重要的还是思想.专门定义

工厂模式总结(简单工厂,工厂方法,抽象工厂)

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式. 通过两个例子讲解这三种工厂模式 示例一 简单工厂模式 首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品.当增加新的产品时,就需要修改工厂类.有点抽象,举个例子就明白了.有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核.客户需要什么样的处理器核,一定要显示地告诉生产工厂.下面给出一种实现方案. 1 enum CTYPE {COREA, COREB}; 2 class

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

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

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

工厂模式,简单工厂模式,抽象工厂模式三者有什么区别

工厂模式,也叫做说虚构造器,在简单工厂中间插入了一个具体产品工厂,这个工厂知道产品构造时候的具体细节,而简单工厂模式的产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面的.工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面.在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码.而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case