工厂用来生产对象,对象具有方法和属性。

简单工厂的缺点(简单工厂并不是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设计模式,简单工厂,工厂方法,抽象工厂三大工厂的区别与联系的更多相关文章

  1. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html   v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客 ...

  2. 结合JDK源码看设计模式——简单工厂、工厂方法、抽象工厂

    三种工厂模式的详解: 简单工厂模式: 适用场景:工厂类负责创建的对象较少,客户端只关心传入工厂类的参数,对于如何创建对象的逻辑不关心 缺点:如果要新加产品,就需要修改工厂类的判断逻辑,违背软件设计中的 ...

  3. 设计模式--简单工厂VS工厂VS抽象工厂

    前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ...

  4. Head First设计模式——简单工厂、工厂、抽象工厂

    前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习.并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同. 话说Head First认为简单工厂并不是设计模式,而是 ...

  5. C# 设计模式(1)——简单工厂模式、工厂模式、抽象工厂模式

    1.前言 上一篇写了设计模式原则有助于我们开发程序的时候能写出高质量的代码(牵一发而不动全身),这个系列还是做个笔记温习一下各种设计模式,下面就看看简单工厂模式.工厂模式.抽象工厂模式. 2.简单工厂 ...

  6. C#设计模式——简单工厂模式、工厂模式和抽象工厂模式

    一:简单工厂模式 1:描述:简单工厂模式是由一个工厂对象根据接收到的消息决定要创建哪一个类的对象事例. 2:优点:工厂类中有相关逻辑判断,可以根据需要动态创建相关的对象事例,而客户端只需要告诉工厂类创 ...

  7. iOS设计模式解析(二)抽象工厂方法

    抽象工厂方法:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 与工厂方法区别: 抽象工厂通过对象组合创建抽象产品.工厂通过类集成创建抽象产品 抽象工厂创建多系列产品.工厂创建一种产 ...

  8. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  9. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

随机推荐

  1. Atcoder Grand Contest 039B(思维,BFS)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;int col[207],s[207],n;c ...

  2. python闯关之路一(语法基础)

      1,什么是编程?为什么要编程? 答:编程是个动词,编程就等于写代码,那么写代码是为了什么呢?也就是为什么要编程呢,肯定是为了让计算机帮我们搞事情,代码就是计算机能理解的语言. 2,编程语言进化史是 ...

  3. 计算机基础- 序列化(Serialization)和持久化(Persistence)的区别

    参考 https://en.wikipedia.org/wiki/Serialization https://en.wikipedia.org/wiki/Persistence_(computer_s ...

  4. https和http的主要区别

    HTTPS和HTTP的区别主要如下: 1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用. 2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输 ...

  5. vue父孙组件传值($attr及$listeners)的使用

    父组件 <template> <div> <!-- 将值传给子组件 子组件可以获取自己想要的值 也可以忽视掉需要传给孙子组件的值 --> <!-- 同时获取通 ...

  6. 2.9 logistic回归中的梯度下降法(非常重要,一定要重点理解)

    怎么样计算偏导数来实现logistic回归的梯度下降法 它的核心关键点是其中的几个重要公式用来实现logistic回归的梯度下降法 接下来开始学习logistic回归的梯度下降法 logistic回归 ...

  7. 02-08Android学习进度报告八

    今天主要学习了昨天还没有学习完的Date & Time组件的知识. 首先是DatePicker(日期选择器) android:calendarTextColor : 日历列表的文本的颜色 an ...

  8. [转]Java——Servlet的配置和测试

    本文转自:http://blog.csdn.net/makefish/article/details/6904807 本文以一个实例介绍如何用Java开发Servlet. 主要内容有: 配置和验证To ...

  9. AVL-Tree (平衡二叉树)

    看到网上AVL-Tree大多数都是用相同的实现方式 —— 递归进行插入.删除.维护平衡等,而我比较喜欢用带父指针的数据结构,于是想了一下午,用C实现了一个迭代版的. 由于没有暂时没有好的画二叉树的工具 ...

  10. C++11 — lambda表达式(匿名函数)

    C++11中lambda表达式的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } 其中 [] 内为外部变量的传递方式: [] ...