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

简单工厂的缺点(简单工厂并不是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. linux压缩包管理

    1.gzip 文件 ----> .gz格式的压缩包 2.bzip2 文件 ----> .bz2格式的压缩包 3.tar -- 不使用z/j参数 该命令只能对文件或目录打包 参数: c -- ...

  2. python 静态方法,类方法,类下面的函数区别

    @clssmenthod(类方法) 与 @staticmethod(静态方法) 与类下面的函数的区别: 1.@classmethod修饰的方法def name(cls)需要通过cls参数传递当前类本身 ...

  3. teraterm中log中加入时间戳

    步骤: 1.Setup->Additional settings->log->Timestamp(Local Time) 2.记录log.File->log(Teraterm. ...

  4. js中怎么把类数组转化为数组

    说起伪数组,首先想到arguments, 这个我们函数参数的一个类数组,是类数组的代表. 1.拥有length属性,可以使用下标来访问元素,这两点和数组相同. 2.不能使用数组的方法,他们不能使用Ar ...

  5. 将图片转化为base64编码字符串

    pom依赖 <dependency> <groupId>org.ops4j.base</groupId> <artifactId>ops4j-base- ...

  6. MongoDB基础篇2:数据库/用户/数据集合的增删改

    一.数据库操作 创建并进入数据库: 命令:use DATABASE_NAME 示例:use tms   查看所有数据库: 命令:show dbs   注意: (1)新创建的数据库在show dbs命令 ...

  7. ImagePullBackOff 错误处理

    kubectl create -f nginx-deployment.yaml 执行之后,kubectl get pods 一致出现 ImagePullBackOff,一直无法执行成功. yaml文件 ...

  8. redis集群配置文件

    bind xxx.xxx.xxx.xxx 绑定redis服务器网卡IP,默认为127.,即本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接.如果bind选项为空的 ...

  9. 「CH6101」最优贸易

    「CH6101」最优贸易 传送门 考虑一种贪心的思想:我们要尽量买价格小的货物,并尽量高价转卖. 我们记 : \(mn[i]\) 为从点 \(1\) 走到点 \(i\) 经过的价格最小的货物的价格. ...

  10. 如何使用gcc_clang进行C语言的编译_编译的流程是什么?

    编译命令 gcc/clang -g -O2 -o -c test test.c -I... -L... -l -g : 输出文件中的调试信息 -O : 对输出文件做出指令优化,默认是O1, O2优化更 ...