01.DesignParttern设计模式,简单工厂,工厂方法,抽象工厂三大工厂的区别与联系
工厂用来生产对象,对象具有方法和属性。
简单工厂的缺点(简单工厂并不是23中设计模式):
工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则;
JDK源码中使用的简单工厂类:
Calendar;
改进方法:能够直接通过反射去改进简单工厂的开闭原则(对扩展开放,对修改关闭);
工厂方法:
定义一个创建对象的接口,但让实现这个接口的类,来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
适用场景:
1):创建对象需要大量的重复代码
2):客户端不依赖于产品类实力如何被创建,实现等细节。
3):一个类通过子类来制定创建哪一个对象
工厂方法-优点:
用户只需要关心产品对应的工厂无需关心创建细节。
加入新产品符合开闭原则,提高可扩展性
工厂方法-缺点:
类的个数容易过多,增加复杂度。
增加了系统的抽象性和理解难度。
public abstract class Video {
    public abstract void produce();
}
public abstract class VideoFactory {
    public abstract Video getVideo();
//    public Video getVideo(Class c){
//        Video video = null;
//        try {
//            video = (Video) Class.forName(c.getName()).newInstance();
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//        return video;
//    }
//
//
//    public Video getVideo(String type){
//        if("java".equalsIgnoreCase(type)){
//            return new JavaVideo();
//        }else if("python".equalsIgnoreCase(type)){
//            return new PythonVideo();
//        }
//        return null;
//    }
}
public class PythonVideoFactory extends VideoFactory {
    @Override
    public Video getVideo()
    {
        return new PythonVideo();
    }
}
public class PythonVideo extends Video {
    @Override
    public void produce()
    {
        System.out.println("录制Python课程视频");
    }
}
public class JavaVideoFactory extends VideoFactory {
    @Override
    public Video getVideo()
    {
        return new JavaVideo();
    }
}
public class JavaVideo extends Video {
    @Override
    public void produce()
    {
        System.out.println("录制Java课程视频");
    }
}
public class Test {
    public static void main(String[] args) {
        VideoFactory videoFactory = new PythonVideoFactory();
        VideoFactory videoFactory2 = new JavaVideoFactory();
        VideoFactory videoFactory3 = new FEVideoFactory();
        Video video = videoFactory.getVideo();
        video.produce();
    }
}

抽象工厂模式:
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口。
无需指定具体的类
适用场景:
客户端不依赖于产品类实例如何被创建实现等细节。
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码。
提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现。
抽象工厂-优点:
具体产品在应用层代码隔离,无需关心创建细节。
将一个一系列产品族统一到一起创建。
抽象工厂-缺点:
1.规定了所有可能被创建的产品集合,产品族中扩展新的产品比较困难,需要修改新的抽象接口
2.增加了系统的抽象度和理解难度。
总结:
抽象工厂平时开发产品的时候要去找产品等级相对固定的。

抽象工厂模式对应的是产品族。
工厂方法模式对应的是产品等级结构。

public interface CourseFactory {
    Video getVideo();
    Article getArticle();
}
public abstract class Article {
    public abstract void produce();
}
public abstract class Video {
    public abstract void produce();
}
public class JavaCourseFactory implements CourseFactory {
    @Override
    public Video getVideo()
    {
        return new JavaVideo();
    }
    @Override
    public Article getArticle()
    {
        return new JavaArticle();
    }
}
public class JavaArticle extends Article {
    @Override
    public void produce()
    {
        System.out.println("编写Java课程手记");
    }
}
public class JavaArticle extends Article {
    @Override
    public void produce()
    {
        System.out.println("编写Java课程手记");
    }
}
public class PythonCourseFactory implements CourseFactory {
    @Override
    public Video getVideo()
    {
        return new PythonVideo();
    }
    @Override
    public Article getArticle()
    {
        return new PythonArticle();
    }
}
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Python课程视频");
    }
}
public class PythonArticle extends Article {
    @Override
    public void produce()
    {
        System.out.println("编写Python课程手记");
    }
}

01.DesignParttern设计模式,简单工厂,工厂方法,抽象工厂三大工厂的区别与联系的更多相关文章
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录
		1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ... 
- 结合JDK源码看设计模式——简单工厂、工厂方法、抽象工厂
		三种工厂模式的详解: 简单工厂模式: 适用场景:工厂类负责创建的对象较少,客户端只关心传入工厂类的参数,对于如何创建对象的逻辑不关心 缺点:如果要新加产品,就需要修改工厂类的判断逻辑,违背软件设计中的 ... 
- 设计模式--简单工厂VS工厂VS抽象工厂
		前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ... 
- Head First设计模式——简单工厂、工厂、抽象工厂
		前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习.并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同. 话说Head First认为简单工厂并不是设计模式,而是 ... 
- C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式
		1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ... 
- C#设计模式——简单工厂模式、工厂模式和抽象工厂模式
		一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ... 
- iOS设计模式解析(二)抽象工厂方法
		抽象工厂方法:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 与工厂方法区别: 抽象工厂通过对象组合创建抽象产品.工厂通过类集成创建抽象产品 抽象工厂创建多系列产品.工厂创建一种产 ... 
- 设计模式之工厂模式VS抽象工厂
		一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ... 
- 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)
		今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ... 
随机推荐
- 研发2nm芯片,台积电如何做到天下第一?
			日前,台积电宣布,正式启动2nm芯片工艺的研发,工厂将会设置在台湾新竹的南方科技园,预计2024年投入量产,发言人称:2nm工艺是一个重要节点,目标是比3nm制程缩小23%.科技先锋总会打脸分析专家, ... 
- Mockito 中文文档 ( 2.0.26 beta )
			Mockito 中文文档 ( 2.0.26 beta ) 由于缺乏校对,难免有谬误之处,如果发现任何语句不通顺.翻译错误,都可以在github中的项目提出issue.谢谢~ Mockito框架官方地址 ... 
- .net core 2.1控制台使用Quartz.net实现定时任务执行
			权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_33435149/article/de ... 
- STM32新MCU
			G0的出现完美的替换自家目前的F0系列而且有更好的性能和价格优势; STM32WL世界上首款LoRa Soc单片机嵌入了基于Semtech SX126x的经过特殊设计的无线电,该无线电提供两种功率输出 ... 
- TouchGFX
			TouchGFX让用户界面代码只占用10KB的 SRAM空间和20KB的闪存空间的C ++软件框架.有无操作系统均可 
- 监听EditView中的文本改变事件详解--转
			转自: http://blog.csdn.net/zoeice/article/details/7700529 android中的编辑框EditText也比较常用,那比如在搜索框中,没输入一个字,下面 ... 
- 三大JavaScript框架对比——AngularJS、BackboneJS和EmberJS
			<三大JavaScript框架对比——AngularJS.BackboneJS和EmberJS> 本文转载自 作者:chszs,博客主页:http://blog.csdn.net/chs ... 
- 解题报告:luogu P5745 【深基附B例】数列求和
			题目链接:P5745 [深基附B例]数列求和 现在想说:\(O(N)\)的题要不怎么也想不出来,要不灵光乍现,就像这道题. 我们维护一个类似单调队列的加法单调队列: 若相加大于此数,就将队尾元素弹出, ... 
- 写给想要入门python或者正在入门python的小朋友们
			写在前面: 最近好像python挺火,虽然我也在天天写python,但是python毕竟是动态语言,就拿常被人吐槽的java来说,python绝大不多数地方是不如java的.python只能是你的一个 ... 
- NXP TJA1040, TJA1042, TJA1050 TJA1051, TJA1057, TJA1044, TJA1055区别
			历史关系 PCA82C250和PCA82C251是属于NXP第一代 CAN PHY(CAN物理层收发器): TJA1050, TJA1040和TJA1041是属于NXP第二代CAN PHY: TJA1 ... 
