工厂方法(创建型)

工厂方法(Factory Method)

  1、定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。

  

  Client:作为开始节点

  Game:抽象产品基类,做为具体的产品抽象类,所有同类的产品都继承它

  Factory:抽象工厂基类,任何产品工厂必须继承

  xxxGame:具体产品类,继承抽象产品基类,并实现,由工厂创建实例对象。

  xxxxFactory:具体的工厂类,用于创建产品实例

  

namespace 工厂方法
{
    class Program
    {
        static void Main(string[] args)
        {       
            Console.WriteLine("打开LOL");
            //创建工厂   例如:电脑上某加密文件夹下有很多游戏,文件夹可视为一个抽象工厂,具体某游戏的包视为一个生产的工厂
            GameFactory lol = new LOLFactory();
            //找到工厂里的EXE
            Game l= lol.OpenGame();
            //开打游戏开始氪金
            l.Play();
            l.Khorium();
            Console.WriteLine("==================分割线=================");
            Console.WriteLine("打开DNF");
            GameFactory dnf = new DNFFactory();
            Game g = dnf.OpenGame();
            g.Play();
            g.Khorium();
            Console.ReadLine();
        }
    }
    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class Game
    {
        public abstract void Play();
        public abstract void Khorium();
    }

    public class LOL : Game
    {
        public override void Khorium()
        {
            Console.WriteLine("皮肤不错充钱买个来装B");
        }
        public override void Play()
        {
            Console.WriteLine("开一局嗨起来");
        }
    }
    public class DNF : Game
    {
        public override void Khorium()
        {
            Console.WriteLine("充钱不一定变强,不充钱一定是垃圾");
        }
        public override void Play()
        {
            Console.WriteLine("又是充满希望的一天");
        }
    }
    /// <summary>
    /// 抽象产品
    /// </summary>
    public abstract class GameFactory
    {
        public abstract Game OpenGame();
    }
    public class LOLFactory : GameFactory
    {
        public override Game OpenGame()
        {
            return new LOL();
        }
    }
    public class DNFFactory : GameFactory
    {
        public override Game OpenGame()
        {
            return new DNF();
        }
    }
}

   使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动,例如:想玩吃鸡,上面没有,在不改动抽象工厂和抽象产品的情况下,只需要添加具体产品和具体生产工厂对象。

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

namespace 工厂方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("打开LOL");
            GameFactory lol = new LOLFactory();
            Game l= lol.OpenGame();
            //开打游戏开始氪金
            l.Play();
            l.Khorium();
            Console.WriteLine("==================分割线=================");
            Console.WriteLine("打开DNF");
            GameFactory dnf = new DNFFactory();
            Game g = dnf.OpenGame();
            g.Play();
            g.Khorium();

            Console.WriteLine("==================分割线=================");

            GameFactory pubg = new PUBGFactory();
            Console.WriteLine("开始吃鸡");
            Game game= pubg.OpenGame();
            game.Khorium();
            game.Play();

            Console.ReadLine();
        }
    }
    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public abstract class Game
    {
        public abstract void Play();

        public abstract void Khorium();

    }
    public class PUBG : Game
    {
        public override void Khorium()
        {
             Console.WriteLine("首付+月供");
        }

        public override void Play()
        {
            Console.WriteLine("晚上吃鸡");
        }
    }
    public class LOL : Game
    {
        public override void Khorium()
        {
            Console.WriteLine("皮肤不错充钱买个来装B");
        }

        public override void Play()
        {
            Console.WriteLine("开一局嗨起来");
        }
    }
    public class DNF : Game
    {
        public override void Khorium()
        {
            Console.WriteLine("充钱不一定变强,不充钱一定是垃圾");
        }

        public override void Play()
        {
            Console.WriteLine("又是充满希望的一天");
        }
    }
    /// <summary>
    /// 抽象产品
    /// </summary>
    public abstract class GameFactory
    {
        public abstract Game OpenGame();
    }

    public class LOLFactory : GameFactory
    {
        public override Game OpenGame()
        {
            return new LOL();
        }

    }
    public class DNFFactory : GameFactory
    {
        public override Game OpenGame()
        {
            return new DNF();
        }
    }

    public class PUBGFactory : GameFactory
    {
        public override Game OpenGame()
        {
            return new PUBG();
        }
    }

}

  优点:

   (1)、 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。

(2)、在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。

  缺点:

    (1)、每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

  使用场景:

    (1)、一个类不知道它所需要的对象的类。在工厂方法模式中,我们不需要具体产品的类名,我们只需要知道创建它的具体工厂即可。

(2)、一个类通过其子类来指定创建那个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

(3)、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。

  

原文地址:https://www.cnblogs.com/li-lun/p/9047441.html

时间: 2024-08-04 00:42:04

工厂方法(创建型)的相关文章

设计模式(三): FACTORY工厂模式 -- 创建型模式

1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类. 2.适用场景 1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来.Java Collection中的iterator() 方法即属于这种情况. 2.第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给

设计模式(四):SIMPLE FACTORY简单工厂模式 -- 创建型模式

1.定义 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 2.适用场景 如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用.后来出现工业革命.用户不用去创建宝马车.因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建.比如想要320i系列车.工厂就创建这个系列的车.即工厂可以创建产品. 3.评价 优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

跟着实例学习设计模式(4)-抽象工厂(创建型)

抽象工厂属于创建型设计模式 设计意图:提供一个接口.能够创建一系列相关或相互依赖的对象,而无须指定它们详细的类. 光看设计意图有些抽象,不好理解.让我们来看一下实例类图,结合类图我们再做详细的解释,相信会让大家豁然开朗的.我们以生产汽车为例,我们生产的汽车分两个系列,小车.卡车,每一个系列汽车都有发动机和油箱. 上图: IAbstrcatFactory:抽象工厂接口,声明创建抽象产品的方法. CarFactory:小车工厂实现类. TrunkFactory:卡车工厂实现类. 这里我们为每一个系列

HttpSolrServer-采用静态工厂方法,创建HttpSolrServer单实例

HttpSolrServer线程安全,如果使用下面构造器,必须对所有的请求重用相同的实例.如果实例在运行中创建的,它可能会导致连接泄漏.推荐的做法就是保持每个solr服务url的HttpSolrServer的静态实例,所有的请求都共享这个实例.参考https://issues.apache.org/jira/browse/SOLR-861查看更多细节.1.创建配置文件solr-config.properties: cores=ac,jd base_url=http://127.0.0.a:131

通过工厂方法创建bean实例

1.静态工厂方法 /** * 静态工厂方法:直接调用某一个类的静态方法就可以返回bean实例 *  * */ 1)先建立静态工厂public class StaticCarFactory { private static Map<String,Car> cars = new HashMap<String,Car>(); static { cars.put("audi", new Car("audi",300000)); cars.put(&q

简单工厂模式---创建型模式

简单工厂模式是类的创建模式,由一个参数(产品的类型)来判断创建对应的产品实例. 下面以登入为例:域名登入 或 密码登入等(有各种登入方式,需要一个抽象类,以供具体登入类实现) /****************接口类************************/ package simpleFactoryType; /**     * 登入接口,以供各种登入方式实现接口     * (在工厂模式中,实现该登入接口的相当于各种对应产品)     * @author dxx     *    *

设计模式之简单工厂模式(创建型)

定义 简单工厂模式又称静态工厂模式.可以根据参数的不同返回不同类的实例.定义一个类来创建其它类的实例. 角色 简单工厂模式包含如下角色 Factory:工厂角色 Product:抽象产品角色 ConcreteProduct:具体产品角色 简单实例 public abstract class Produce{ public abstract void m1()'' } public class ConcreteProduct extends Produce{ public void m1(){}

创建型模式:建造者模式

个人公众号原文: 创建型模式:建造者模式 五大创建型模式之四:建造者模式. 简介 姓名 :建造者模式 英文名 :Builder Pattern 价值观 :专治丢三落四 个人介绍 : Separate the construction of a complex object from its representation so that the same construction process can create different representations. 将一个复杂对象的构建与它的

创建型模式:原型模式

个人公众号原文: 创建型模式:原型模式 五大创建型模式之五:原型模式. 简介 姓名 :原型模式 英文名 :Prototype Pattern 价值观 :效率第一 个人介绍 : Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype. 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. (来自<设计模式之禅