三种工厂模式

您所在的位置:网站首页 工厂模式分为三种类型 三种工厂模式

三种工厂模式

2023-11-11 00:43| 来源: 网络整理| 查看: 265

1 概述

工厂模式又称为创建模式,它是建对象的一种最佳方式。工厂模式的本质就是用工厂方法代替new操作创建一种实例化对象的方式。一句话中总结就是方便创建 同种类型接口产品 的 复杂对象。

**举例:**实例化一个对象sample 一般会想到的方法是通过构造器来创建sample s=new sample();但是在实际情况下最好不要这样做,如果sample类的在实例化的时候需要初始化参数而这些参数需要别的类的信息,这样你new的话会增加你代码的耦合度,不利于维护。所以我们就需要将创建实例的工作和使用使用实例的工作分开,即:使用工厂方法创建实例的工作封装起来。这样我们在需要调用对象的时候就不需要关心那些复杂的实例化问题。

   工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。  工厂模式可以分为三类: 

1)简单工厂模式(Simple Factory)  2)工厂方法模式(Factory Method)  3)抽象工厂模式(Abstract Factory) 

 这三种模式从上到下逐步抽象,并且更具一般性。          GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。

        将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 

区别  工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类可以创建多个具体产品类的实例。    区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 两者皆可。 

2 工厂模式示例

 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。     2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。     3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。

   4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。于是这个工厂开始生产宝马车和需要的空调。

   最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.

   这就是工厂模式。

1.简单工厂模式

 

工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品

抽象产品角色:它一般是具体产品继承的父类或者实现的接口。

具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

//产品类 abstract class BMW{ public BMW(){} } //具体产品类 public class BMW100 extends BMW{ public BMW100(){ System.out.println("this is BMW100"); } } public class BMW200 extends BMW{ public BMW200(){ System.out.println("this is BMW200"); } } //工厂类 public class Factory{ public BMW CreateBMW(int type){ if(type ==100) return new BMW100(); if(type ==200) return new BMW200(); else return null; } }

分析

在简单工厂中,当客户不再满足现有的车型号时,想要一种更快的车,只要这种车满足抽象产品指定的规则,只要通知工厂类增加相应的逻辑就好了,但是每增加一种车,都要在工厂类中增加相应的逻辑,工厂类十分被动,这样的工厂类成为全能类或者上帝类。

2 工厂方法模式

角色构成

1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的上帝类,分担了对象承受的压力。

//抽象产品类 abstract class BMW() { public BMW(); } // 具体产品类 四种车,宝马1系,(两种),2系(两种) public class BMW100 extends BMW { public BMW100() { System.out.println("this is BMW100"); } } public class BMW109 extends BMW { public BMW109() { System.out.println("this is BMW100"); } } public class BMW200 extends BMW { public BMW200() { System.out.println("this is BMW200"); } } public class BMW209 extends BMW { public BMW209() { System.out.println("this is BMW209"); } } //抽象工厂角色 interface Factory { BMW createBMW(); } //具体工厂角色 public class FactoryBMW1 implements FactoryBMW{ @Override public BMW100 createBMW() { return new BMW100(); } } public class FactoryBMW2 implements FactoryBMW { @Override public BMW200 createBMW() { return new BMW200(); } } //分为100的工厂和200的工厂(省略了两个工厂)。都实现了工厂的接口

分析

想加一辆车,就单独加车的类,这个车的工厂,然后只修改客户端的代码即可。工厂方法模式实现时,客户端需要决定实例化哪一个工厂来创建对象,工厂方法把简单工厂的内部逻辑移到了客户端代码来执行。

3 抽象工厂模式

抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。

抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。就是一个工厂里放一些相关的类,使工厂数减少。

最大的好处便是易于交换产品系列,其次是让具体的创建实例过程与客户端分离,客户端通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离。不会出现在客户代码中

抽象工厂方法就是一个工厂里生产不同等级结构中的一个(其中一种车)中的不同的配件(不同的车的属性)

//抽象产品类1 发动机以及型号 public interface Engine { } //抽象产品类2 空调以及型号 public interface Aircondition { } //具体产品类 public class EngineA extends Engine{ public EngineA(){ System.out.println("制造-->EngineA"); } } public class EngineB extends Engine{ public EngineB(){ System.out.println("制造-->EngineB"); } } public class AirconditionA extends Aircondition{ public AirconditionA(){ System.out.println("制造-->AirconditionA"); } } public class AirconditionB extends Aircondition{ public AirconditionB(){ System.out.println("制造-->AirconditionB"); } } //抽象工厂 public interface AbstractFactory { //制造发动机 public Engine createEngine(); //制造空调 public Aircondition createAircondition(); } //具体工厂类 public class 奔驰工厂 implements AbstractFactory{ @Override public Engine createEngine() { return new EngineA(); } @Override public Aircondition createAircondition() { return new AirconditionA(); } } //为宝马车生产配件 public class 宝马工厂 implements AbstractFactory { @Override public Engine createEngine() { return new EngineB(); } @Override public Aircondition createAircondition() { return new AirconditionB(); } }

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

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3