工厂模式(Factory)

一、工厂模式介绍:

工厂模式实现了创建者和调用者的分离

工厂模式分类:

1.简单工厂模式

2.工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类

?3.抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

面向对象设计的基本原则:

OCP(开闭原则,Open-Closed Principle):

一个软件的实体应当对扩展开放,对修改关闭。也就是说如果你要对一个已存在的系统做扩展的时候尽量要新增加类,而不是在原有的基础上修改。

DIP(依赖倒转原则,Dependence Inversion Principle)

针对接口编程,不要针对实现编程。

LoD(迪米特法则,Law Of Demeter)

只与你直接的朋友通信,而避免和陌生人通信。一个类尽量少的依赖其他类

二、工厂模式代码实现

未使用工厂模式的情况


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

//汽车接口

public interface Car {

    void run();

}

//奥迪

public class Audi implements Car { 

    @Override

    public void run() {

        System.out.println("奥迪在跑");

    }

}

//比亚迪

public class Byd implements Car {

    @Override

    public void run() {

        System.out.println("比亚迪在跑。");

    }

}

//汽车测试类

public class TestCar {//调用者

    public static void main(String[] args) {

        Car c1 = new Byd();

        Car c2 = new Audi();    

        c1.run();

        c2.run();

        //未使用工厂模式的时候,调用者会依赖很多类。违反了开闭原则

    }

}

1、简单工厂模式:虽然能通过工厂来创建对象,但是违反了开闭原则。一旦增加功能需要在原有基础上修改代码。

使用了简单工厂模式后:可以创建一个工厂类,该类中提供一个创建汽车的工厂(方法)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

//汽车工厂

public class CarFactory {

    /**

     * 创建汽车

     * @param type

     * @return

     */

    public static Car createCar(String type){

        //该方法还会有问题,假如以后有很多汽车都需要工厂来创建。则又得修改源代码,违反了OCP开闭原则

        if ("audi".equals(type)) {

            return new Audi();

        }else if ("byd".equals(type)) {

            return new Byd();

        }else{

            return null;

        }

    }

}

//测试简单工厂方法

public class TestSimpleFactoryCar {//调用者

    public static void main(String[] args) {

        //创建汽车

        Car audi = CarFactory.createCar("audi");//创建者

        Car byd = CarFactory.createCar("byd");

        audi.run();

        byd.run();

    }

}

2、工厂方法模式:将工厂类调整为工厂接口,需要什么类型的工厂就使用该类实现该工厂,创建相应的产品。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

//工厂接口

public interface CarFactory {

    //创建汽车方法

    Car createCar();

}

//创建比亚迪汽车的工厂

public class BydFactory implements CarFactory{

    @Override

    public Car createCar() {

        return new Byd();

    }

}

//创建奥迪的工厂

public class AudiFactory implements CarFactory {

    @Override

    public Car createCar() {

        return new Audi();

    }

}

//测试工厂方法

public class TestFactoryMethod {

    public static void main(String[] args) {

        /**

         * 工厂方法模式好处在于,以后如果再增加一辆车。只需再实现CarFactory接口即可。避免了OCP开闭原则

         * 不用在原来的代码上修改,只需新增类即可。

         * 例如:增加一辆奔驰,增加一个奔驰工厂BenzFactory即可。更好扩展

         */

        Car audi = new AudiFactory().createCar();

        Car byd = new BydFactory().createCar();

        audi.run();

        byd.run();

    }

}

3、抽象工厂模式:抽象工厂模式用来生产不同产品族的全部产品,对于只增加产品某一部分则不适用。抽象工厂模式是工厂模式的一种升级版本。

在有多个业务品种,业务分类时,抽象工厂能产品不同类别的一个全部产品。例如:生产汽车,抽象工厂模式可以生产高端汽车全部配件来组成一个高端汽车,

低端汽车全部配件来组成要给低端的汽车,但是不能产生一个高端的发动机和一个低端的座椅来组成一个中等的汽车。这样会混乱。

代码实现:

首先使用一个接口来定义一个发动机,使用具体的类来定义发动机的好坏(具体实现)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/**

 * 发动机接口

 */

public interface Engine {

    void run();

    void start();

}

//好的发动机

class LuxuryEngine implements Engine{

    @Override

    public void run() {

        System.out.println("好发动机转的快");

    }

    @Override

    public void start() {

        System.out.println("启动快,自动启停");

    }

}

//差的发动机

class LowEngine implements Engine{

    @Override

    public void run() {

        System.out.println("转的慢");

    }

    @Override

    public void start() {

        System.out.println("启动慢");

    }

}

定义一个汽车总工厂,用来生产各种类型的汽车。所有的汽车都需要依赖此工厂来生产汽车。


1

2

3

4

5

6

7

8

/**

 *  汽车总工厂,可以创建轮胎,座椅,发动机

 */

public interface CarFactory {

    Engine createEngine();//创建发动机

    Seat createSeat();//创建座椅

    Tyre createTyre();//创建轮胎

}

然后根据生产的不同产品,类创建具体的实现来生产汽车。例如:专门生产高端的汽车,专门生产低端的汽车。都可以用针对CarFactory具体的实现来创建。

高端汽车制造工厂,所有汽车的生产必须依赖汽车总工厂


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

 *  高端汽车制造工厂

 */

public class LuxuryCarFactory implements CarFactory{

    @Override

    public Engine createEngine() {

        return new LuxuryEngine();

    }

    @Override

    public Seat createSeat() {

        return new LuxurySeat();

    }

    @Override

    public Tyre createTyre() {

        return new LuxuryTyre();

    }

}

低端汽车制造工厂,所有汽车的生产必须依赖汽车总工厂


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/**

 *  低端汽车制造工厂

 */

public class LowCarFactory implements CarFactory{

    @Override

    public Engine createEngine() {

        return new LowEngine();

    }

    @Override

    public Seat createSeat() {

        return new LowSeat();

    }

    @Override

    public Tyre createTyre() {

        return new LowTyre();

    }

}

具体生产汽车的时候就可以根据需要来创建具体的汽车了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public static void main(String[] args) {

    //想要好车

    CarFactory factory = new LuxuryCarFactory();

    Engine engine = factory.createEngine();//创建高端发动机

    engine.run();

    engine.start();

    

    //想要差一点的车

    CarFactory factory2 = new LowCarFactory();

    Engine e2= factory2.createEngine();

    Seat s2 = factory2.createSeat();

    Tyre t2 = factory2.createTyre();

    e2.run();

    e2.start();

    //以后想要中等车的话可以增加相应中等配件的接口

}

以上就是一个针对产品族的工厂,用来生产一个产品,而不是一个配件。假如以后想生产一个中端汽车产品。就可以增加相应的类,实现汽车总工厂CarFactory

来生产。

三、工厂模式要点

简单工厂模式(静态工厂模式)

虽然某种程度不符合面向对象规则(不符合开闭原则,每次新增内容都需要在原有代码上修改),但是实际使用最多。

工厂方法模式

不修改已有类的前提下,通过增加新类来实现扩展。

抽象工厂模式

不可以增加产品中某一个配件,可以增加一个具体的产品族。

 

四、应用场景

JDK中的Calendar的getInstance方法

JDBC中Connection对象的获取getConnection

Hibernate中SessionFactory创建Session

spring中的IOC容器创建管理bean对象的时候也是工厂模式

XML解析时的DocumentBuilderFactory创建解析器对象

反射中Class对象的newInstance方法。

Java23种设计模式学习笔记【目录总贴】

参考资料:

  大话设计模式(带目录完整版).pdf

  HEAD_FIRST设计模式(中文版).pdf

  尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】

时间: 2024-08-08 13:53:12

工厂模式(Factory)的相关文章

工厂模式(Factory)和抽象工厂模式(Abstract Factory)

一.工厂模式(Factory):通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的,工厂方法让类的实例化推迟到子类 (1)涉及角色:抽象产品,具体产品,抽象创建者,具体创建者.                (2)实例:    抽象产品类 1 public abstract class ProductNoodle { 2 public abstract String description(); 3 } 具体产品类 1 public class ConcreteNoodleA e

设计模式(一)工厂模式Factory(创建类型)

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.可是在一些情况下, new操作符直接生成对象会带来一些问题. 举例来说, 很多类型对象的创造须要一系列的步骤: 你可能须要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你须要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你怎样能轻松方

设计模式一 工厂模式Factory

设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便

设计模式(一)工厂模式Factory(创建型)(转)

原文链接:http://blog.csdn.net/hguisu/article/details/7505909 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

设计模式(一)工厂模式Factory(创建型)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和

工厂模式(Factory Patter)

1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式,简单工厂不在23种设计模式之列,一般它是根据自变量的不同而返回不同的类型.比较简单实用一些,在学习工厂模式之前下来学习一下简单工厂,有助于我们理解工厂模式. 1.1.简单工厂定义 简单工厂是由一个工厂对象决定创建出哪一种产品类的实例. 其实质就是由一个工厂类根据传入的参数,来决定调用哪一个产品类的实

工厂模式(factory pattern)

工厂模式主要用来封装对象的创建,有3种分类:简单工厂(simple factory).工厂方法(factory method).抽象工厂(abstract factory). 简单工厂包括3种组成元素:抽象产品.具体产品.具体工厂(简单工厂),结构图如下: C++实现: //抽象产品 class Car { public: virtual string getDescription() = 0; }; //具体产品 class Audi : public Car { string getDesc

设计模式(二)工厂模式Factory (创建型)

工厂模式分为三种:简单工厂模式 (Simple Factory) .工厂方法模式(Factory Method).抽象工厂模式(Abstract Factory) //举例:发送邮件和短信的例子 /** * @author Administrator * 产品类 */interface Sender{ void send();}class MailSender implements Sender{ @Override public void send() { System.out.println

设计模式~简单工厂模式(Factory)

简单工厂模式Simple Factory根据提供给它的数据,返回一个类的实例.通常它返回的类都有一个公共的父类(或者接口对象). 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类.简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂.如数据库生产工厂就是简单工厂的一个应用.         采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性:缺点是可实例化的类型在编译期间已经被确定,如果增加新类 型,