精华内容
参与话题
问答
  • 设计模式系列三(抽象工厂方法)

    万次阅读 2019-03-16 01:04:17
    请移步链接:https://www.javaclub.club/blog/article.html?id=30
    请移步链接:https://aiximiao.com/article?id=6
    
    展开全文
  • 5种创建型模式之:抽象工厂模式

    万次阅读 2017-04-07 23:11:25
    抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,...

    为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

     

    抽象工厂模式与工厂方法模式的区别

            抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

            在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。

     

            在上面的类图中,两厢车和三厢车称为两个不同的等级结构;而2.0排量车和2.4排量车则称为两个不同的产品族。再具体一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于另一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于另一个产品族。

            明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了,如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。在本例中,如果一个工厂模式提供2.0排量两厢车和2.4排量两厢车,那么他属于工厂方法模式;如果一个工厂模式是提供2.4排量两厢车和2.4排量三厢车两个产品,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的等级结构。当然,如果一个工厂提供全部四种车型的产品,因为产品分属两个等级结构,他当然也属于抽象工厂模式了。

    抽象工厂模式代码

    interface IProduct1 {  
        public void show();  
    }  
    interface IProduct2 {  
        public void show();  
    }  
      
    class Product1 implements IProduct1 {  
        public void show() {  
            System.out.println("这是1型产品");  
        }  
    }  
    class Product2 implements IProduct2 {  
        public void show() {  
            System.out.println("这是2型产品");  
        }  
    }  
      
    interface IFactory {  
        public IProduct1 createProduct1();  
        public IProduct2 createProduct2();  
    }  
    class Factory implements IFactory{  
        public IProduct1 createProduct1() {  
            return new Product1();  
        }  
        public IProduct2 createProduct2() {  
            return new Product2();  
        }  
    }  
      
    public class Client {  
        public static void main(String[] args){  
            IFactory factory = new Factory();  
            factory.createProduct1().show();  
            factory.createProduct2().show();  
        }  
    }  

    抽象工厂模式的优点

            抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

    抽象工厂模式的缺点

           产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

    适用场景

           当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

    总结

           无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

           所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

    展开全文
  • 抽象工厂

    万次阅读 2016-06-27 17:23:58
    抽象工厂,是生成一组相互关联的产品  比较于工厂方法,工厂方法是多个产品单个层次的产品,比如生产单独的墨水或者笔,这时候就很适合工厂方法,它没有维护组件之间的关系  假如,要生产一套文具,文具是由同一个...

      抽象工厂,是生成一组相互关联的产品
      比较于工厂方法,工厂方法是多个产品单个层次的产品,比如生产单独的墨水或者笔,这时候就很适合工厂方法,它没有维护组件之间的关系
      假如,要生产一套文具,文具是由同一个系列的笔、墨、纸组成的,它们之间是相互关联的,中国的毛笔应该在宣纸上书写文字,中国的毛笔不能在英国的信纸上书写,因为信纸太薄了,这时候,就适合抽象工厂了

    1. 笔工厂

    public interface PenFactory {
        void createPen();
    }
    
    public class ChinesePen implements PenFactory {
        @Override
        public void createPen() {
            System.out.println("我是中国的毛笔");
        }
    }
    
    public class EnglishPen implements PenFactory {
        @Override
        public void createPen() {
            System.out.println("我是英国的鹅毛笔");
        }
    }
    

    2. 墨工厂

    public interface InkFactory {
        void createInk();
    }
    
    public class ChineseInk implements InkFactory {
        @Override
        public void createInk() {
            System.out.println("中国墨水");
        }
    }
    
    public class EnglishInk implements InkFactory {
        @Override
        public void createInk() {
            System.out.println("英国墨水");
        }
    }
    

    3.文具工厂

    /** * 一套文具 * * */
    public interface StationeryFactory {
        void createInk();
    
        void createPen();
    }
    
    /** * 中式文具一套 * * */
    public class ChineseStationeryFactory implements StationeryFactory {
        @Override
        public void createInk() {
            InkFactory chineseInk = new ChineseInk();
            chineseInk.createInk();
        }
    
        @Override
        public void createPen() {
            PenFactory chinesePen = new ChinesePen();
            chinesePen.createPen();
        }
    }
    
    /** * 得到一套英式风格的文具 * * */
    public class EnglishStationeryFactory implements StationeryFactory {
        @Override
        public void createInk() {
            InkFactory englishInk = new EnglishInk();
            englishInk.createInk();
    
        }
    
        @Override
        public void createPen() {
            PenFactory englishPen = new EnglishPen();
            englishPen.createPen();
        }
    }
    

    4.测试

    public class M {
        public static void main(String[] args) {
            /** * 得到一套中式文具 */
            StationeryFactory chineseStationery = new ChineseStationeryFactory();
            chineseStationery.createPen();
            chineseStationery.createInk();
    
            /** * 得到一套英式文具 */
            StationeryFactory englishStationery = new ChineseStationeryFactory();
            englishStationery.createPen();
            englishStationery.createInk();
        }
    }
    
    展开全文
  • 原型模式:对象创建不走构造函数 SingletonPrototype prototype = (SingletonPrototype)_...工厂模式:顾名思义用的很多管理对象的创建 class Program { static void Main(string[] args) { try { {

    抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式属于创建型模式,为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

    抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

    角色

    1、抽象工厂(Creator)

    是抽象工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这此产品族接口;

    2、具体工厂(Concrete Creator)

    这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;

    3、抽象产品(Product)

    所要创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;

    4、具体产品(Concrete Product)

    这个角色实现了抽象产品角色所定义的接口。

    示例
    在这里插入图片描述
    在这里插入图片描述
    命名空间AbstractFactory中包含手机基类MobilePhone、便携式设备基类Tablet和计算机基类Computer,以及它们对应的6个实现类。抽象设备工厂类DeviceFactory包含2个实现类中国工厂ChineseFactory类和美国工厂AmericanFactory类。在智能设备竞争如此激烈的今天,我将尝试用2个不同的工厂来生产一批智能设备,以使大家能够了解抽象工厂模式的正确使用方法。

    public abstract class MobilePhone {
    
        public abstract void Print();
    
    }
    

    抽象手机类MobilePhone,产品族中的一员。

    public class ApplePhone : MobilePhone {
    
        public override void Print() {
            Console.WriteLine("Apple Phone is created by American Factory!");
        }
    
    }
    

    苹果手机实现类ApplePhone,具体的产品。

    public class HuaWeiPhone : MobilePhone {
    
        public override void Print() {
            Console.WriteLine("HuaWei Phone is created by Chinese Factory!");
        }
    
    }
    

    华为手机实现类HuaWeiPhone,具体的产品。

    public abstract class Computer {
    
        public abstract void Print();
    
    }
    

    抽象计算机类Computer,产品族中的一员。

    public class DellComputer : Computer {
    
        public override void Print() {
            Console.WriteLine("Dell Computer is created by American Factory!");
        }
    
    }
    

    戴尔计算机实现类DellComputer,具体的产品。

    public class LenovoComputer : Computer {
    
        public override void Print() {
            Console.WriteLine("Lenovo Computer is created by Chinese Factory!");
        }
    
    }
    

    联想计算机实现类LenovoComputer,具体的产品。

    public abstract class Tablet {
    
        public abstract void Print();
    
    }
    

    抽象便携式设备类Tablet,产品族中的一员。

    public class Nexus10 : Tablet {
    
        public override void Print() {
            Console.WriteLine("Nexus10 is created by American Factory!");
        }
    
    }
    

    Nexus10便携式设备实现类Nexus10,具体的产品。

    public class XiaoMiPad : Tablet {
    
        public override void Print() {
            Console.WriteLine("XiaoMiPad is created by Chinese Factory!");
        }
    
    }
    

    小米平板便携式设备实现类XiaoMiPad,具体的产品。

    public abstract class DeviceFactory {
    
        public abstract MobilePhone CreateMobilePhone();
    
        public abstract Computer CreateComputer();
    
        public abstract Tablet CreatePad();
    
    }
    

    智能设备生产工厂基类,它定义了一个产品族的生成接口,这是区别于工厂方法模式的主要模块。

    public class AmericanFactory : DeviceFactory {
    
        public override MobilePhone CreateMobilePhone() {
            return new ApplePhone();
        }
    
        public override Computer CreateComputer() {
            return new DellComputer();
        }
    
        public override Tablet CreatePad() {
            return new Nexus10();
        }
    
    }
    

    美国工厂类AmericanFactory,是一个具体的智能设备生产工厂。

    public class ChineseFactory : DeviceFactory {
    
        public override MobilePhone CreateMobilePhone() {
            return new HuaWeiPhone();
        }
    
        public override Computer CreateComputer() {
            return new LenovoComputer();
        }
    
        public override Tablet CreatePad() {
            return new XiaoMiPad();
        }
    
    }
    

    中国工厂类ChineseFactory,是一个具体的智能设备生产工厂。

    public class CreateDevice<T> where T : DeviceFactory {
    
        private static T _deviceFactory = null;
    
        public static void Create() {
            _deviceFactory = Activator.CreateInstance<T>();
            _deviceFactory.CreateMobilePhone().Print();
            _deviceFactory.CreateComputer().Print();
            _deviceFactory.CreatePad().Print();
        }
    
    }
    

    一个辅助类,帮助我生产智能设备并向命令行输出结果。

    public class Program {
    
        public static void Main(string[] args) {
            CreateDevice<ChineseFactory>.Create();
            CreateDevice<AmericanFactory>.Create();
    
            Console.ReadKey();
        }
    
    }
    

    以上是调用方的代码,以下是这个案例的输出结果:

    HuaWei Phone is created by Chinese Factory!
    Lenovo Computer is created by Chinese Factory!
    XiaoMiPad is created by Chinese Factory!
    Apple Phone is created by American Factory!
    Dell Computer is created by American Factory!
    Nexus10 is created by American Factory!
    

    优点

    1、能够从多个产品族的多个产品中,简洁的获取想要的具体产品;
    2、解决了工厂模式中的不符合开闭原则的问题。

    缺点

    1、产品族扩展比较困难,要增加一个系列的某一产品,要增加具体的产品类,还要增加对应的工厂类。

    使用场景

    1、一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提;
    2、这个系统有多个系列产品,而系统中只消费其中某一系列产品;
    3、系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。

    展开全文
  • 抽象工厂模式是让工厂和依赖工厂的子类全部依赖一个接口或者抽象类,因为抽象代表这稳定,这样可以很容易的遵循oo中比较著名的开放关闭原则,设计出来的系统、框架或者程序很富有弹性和扩展能力(这句话有点大概的...
  • 简单工厂/工厂方法/抽象工厂

    万次阅读 2020-10-25 22:56:14
    1 简单工厂 根据参数由工厂类来创建对象 /** * 简单工厂 * 目的:根据参数获取对象 * 缺点:新增实现类时,需要修改代码,不好动态扩展(可参考工厂方法) */ public class SimpleFactoryDP { ... //抽象产品
  • 抽象工厂模式

    2017-12-21 22:31:41
    抽象工厂模式
  • 简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法...
  • 大话设计模式(七)抽象工厂模式

    万次阅读 2016-10-09 13:36:27
    大话设计模式(七)抽象工厂模式菜鸟程序员碰到问题,只会用时间来摆平。前言  今天主要讲解抽象工厂模式。抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话”Provide an interface...
  • 简单工厂VS工厂方法VS抽象工厂

    千次阅读 热门讨论 2014-11-17 20:37:10
    cho
  • 大话设计模式(八)抽象工厂模式进化

    万次阅读 2016-10-10 20:49:30
    大话设计模式(八)抽象工厂模式进化前情回顾  在博文《大话设计模式(七)抽象工厂模式》中,我们了解了抽象工厂设计模式。在讲解反射机制时,我们提到反射机制实现了程序由编译时到运行时变量的指定。我们的设计不能...

空空如也

1 2 3 4 5 ... 20
收藏数 33,695
精华内容 13,478
关键字:

抽象工厂