23种植设计模式之——工厂方法模式

有矣简要工厂模式,为什么还得工厂方法模式?

简短工厂模式的极充分优点在工厂类中蕴藏了必需的逻辑判断,根据客户端的取舍规范动态实例化相关的类似,对于客户端的话,去除了跟具象产品之依赖性。如果简单工厂模式需要改变,比如新长一个运算,那么我们必将要是让运算工厂类的点子中加“Case”的道岔条件的,修改原来的好像。这样咱们不光对扩大开放了,对修改为开了,违背了开-封闭原则的。

原文:http://www.codeceo.com/article/23-design-parttens-factory-partten.html

哎呀是厂方法模式?

概念一个用户创建对象的接口,让子类决定实例化哪一个类。工厂方法而一个好像的实例化延迟到其子类。

 

厂子方法模式实现:

经过一个简便计算器程序来贯彻工厂方法模式。

先是先以简便工厂模式创造好,运算抽象类,加法运算实现类似与减法运算实现类似。

运算抽象类:

图片 1

加法实现类似:

图片 2

减法实现类似:

图片 3

简言之除法实现类似与乘法实现类似,如需而活动构建。

紧接下构建一个工厂接口:

图片 4

接下来据此加减各打一个切实可行工厂去实现这个接口:

加以法类工厂:

图片 5

减法类工厂:

图片 6

简简单单除法工厂及乘法工厂,如产生得活动构建,方法同样。

客户端实现如下:

图片 7

率先通过创办yige加法工厂的目标,在经该对象去调用加法方法赢得的加法对象,然后调用计算办法取得计算结果。

运作结果吧:

图片 8

 

工厂方法模式实现时,客户端要控制实例化哪一个厂子来兑现运算类,选择判断的问题还是存在的,也就是说,工厂方法将大概工厂的其中逻辑判断移到了客户端代码来进展。你想只要加效果,本来是改工厂类的,而现是改客户端!

爱好的小伙伴等可以找寻我们个人的微信公众号“程序员的成人之路”点击关注还是扫描下方二维码

图片 9

定义:概念一个用于创建对象的接口,让子类决定实例化哪一个好像,工厂方法要一个看似的实例化延迟到该子类。

类型:始建类模式

类图:

图片 10

工厂方法模式代码

interface IProduct {
    public void productMethod();
}

class Product implements IProduct {
    public void productMethod() {
        System.out.println("产品");
    }
}

interface IFactory {
    public IProduct createProduct();
}

class Factory implements IFactory {
    public IProduct createProduct() {
        return new Product();
    }
}

public class Client {
    public static void main(String[] args) {
        IFactory factory = new Factory();
        IProduct prodect = factory.createProduct();
        prodect.productMethod();
    }
}

厂子模式:

第一要说一下厂子模式。工厂模式根据抽象程度的差分为三种植:简单工厂模式(也受静态工厂模式)、本文所描述的厂子方法模式、以及抽象工厂模式。工厂模式是编程中不时以的一律种植模式。它的严重性优点有:

  • 足要代码结构清晰,有效地包裹变化。在编程中,产品类的实例化有时候是比较复杂和变异的,通过工厂模式,将成品之实例化封装起来,使得调用者根本不管需关注产品之实例化过程,只需要靠工厂即可获得协调想只要之成品。
  • 本着调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关注产品之接口就得了,至于实际的兑现,调用者根本不管需关注。即使改变了切实可行的贯彻,对调用者来说没有任何影响。
  • 下跌耦合度。产品类的实例化通常来说是十分复杂的,它需靠很多底好像,而这些近似对于调用者来说根本不管需清楚,如果运用了厂方法,我们需要做的但是实例化好产品类,然后交给调用者使用。对调用者来说,产品所倚的好像都是晶莹剔透底。

工厂方法模式:

由此工厂方法模式的类图可以看,工厂方法模式产生四个因素:

  • 厂子接口。工厂接口是工厂方法模式之着力,与调用者直接互动用来提供产品。在实质上编程中,有时候为会见下一个抽象类来作暨调用者交互的接口,其精神上是平等的。
  • 厂子实现。在编程中,工厂实现控制如何实例化产品,是实现扩大的不二法门,需要有稍许种产品,就用来微微个具体的厂实现。
  • 活接口。产品接口的最主要目的是概念产品之正规化,所有的活实现还要依照产品接口定义的正规。产品接口是调用者最为关切的,产品接口定义的优劣直接控制了调用者代码的平静。同样,产品接口也得以就此抽象类来代表,但如小心最好永不背里氏替换原则。
  • 出品实现。实现产品接口的具体类,决定了活在客户端挨的现实表现。

前文提到的粗略工厂模式及工厂方法模式极为相似,区别是:简单工厂只生三单元素,他无工厂接口,并且得到产品之点子一般是静态的。因为从没厂接口,所以当厂实现的扩展性方面略弱,可以算所工厂方法模式之简化版,关于简单工厂模式,在斯如出一辙笔画带了。

适用场景:

不论是简约工厂模式,工厂方法模式或抽象工厂模式,他们具备类似的特色,所以她们之适用场景吧是类似的。

先是,作为一如既往栽创建类模式,在其他需要转变复杂对象的地方,都好行使工厂方法模式。有某些需要小心的地方就是复杂对象适合采取工厂模式,而简约对象,特别是才需要通过new就得就创建的目标,无需用工厂模式。如果采取工厂模式,就待引入一个工厂类,会增多系统的复杂度。

从,工厂模式是同样种典型的解耦模式,迪米特法则当工厂模式遭遇显现的更醒目。假如调用者自己组装产品需要加依赖关系常,可以考虑使用工厂模式。将会见大大降低对象中的耦合度。

又,由于工厂模式是借助抽象架构的,它将实例化产品之职责到由实现类似成就,扩展性比较好。也就是说,当得系统出比较好之扩展性时,可以设想工厂模式,不同之活从而不同之落实工厂来组装。

首屈一指以

设若说明工厂模式的优点,可能没比组装汽车还适用的例子了。场景是如此的:汽车由发动机、轮、底盘组成,现在亟需组建一辆车交给调用者。假如不采取工厂模式,代码如下:

class Engine {
    public void getStyle(){
        System.out.println("这是汽车的发动机");
    }
}
class Underpan {
    public void getStyle(){
        System.out.println("这是汽车的底盘");
    }
}
class Wheel {
    public void getStyle(){
        System.out.println("这是汽车的轮胎");
    }
}
public class Client {
    public static void main(String[] args) {
        Engine engine = new Engine();
        Underpan underpan = new Underpan();
        Wheel wheel = new Wheel();
        ICar car = new Car(underpan, wheel, engine);
        car.show();
    }
}

足见到,调用者为了组装汽车还亟需另外实例化发动机、底盘和轮胎,而这些汽车之零件是跟调用者无关的,严重背离了迪米特法则,耦合度太强。并且充分不便利扩展。另外,本例中发动机、底盘和轮胎还是较实际的,在实际用被,可能这些活之零件为都是架空的,调用者根本未懂得什么组装产品。假如下工厂方法吧,整个架构就亮清晰了不少。

interface IFactory {
    public ICar createCar();
}
class Factory implements IFactory {
    public ICar createCar() {
        Engine engine = new Engine();
        Underpan underpan = new Underpan();
        Wheel wheel = new Wheel();
        ICar car = new Car(underpan, wheel, engine);
        return car;
    }
}
public class Client {
    public static void main(String[] args) {
        IFactory factory = new Factory();
        ICar car = factory.createCar();
        car.show();
    }
}

用工厂方法后,调用端的耦合度大大降低了。并且于工厂来说,是可以扩展的,以后要是想组装其他的汽车,只待再行添一个工厂类的贯彻即好。无论是随波逐流还是安定团结都拿走了极大的提高。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图