设计模式---工厂设计模式

工厂模式的UML结构:

Product: 抽象产品,所有的产品必须实现这个共同的接口,使用这些产品的类既可以引用这个接口,而不是具体类

ConcreteProduct: 具体产品

Creator:抽象工厂,实现了所有操作产品的方法,但不实现工厂方法,Creator所有子类都要实现factoryMethod()方法

ConcreteCreator:具体工厂。制造产品的实际工厂,负责创建一个或多个具体产品,只有ConreteCreator类知道如何创建产品

```

/*

*使用简单工厂

*/

//创建一个Pizza抽象类定义创建的方法

public abstract class Pizza{

    public abstract void createPrizza();

}

//定义一个具体的Pizza可以直接继承定义好的抽象类并重写定义的抽象方法

class ChinesePizza extends Pizza{

    public void createPizza()

    {

        System.out.println("ChinesePizza");

    }

}

//书写测试类

class Test{

    public Pizza productPizza(String type)

    {

        if(type.equals("a"))

        {

            return new AmericanPizza();

        }else if(type.equals("b"))

        {

            return new ChinesePizza();

        }

        return null;

    }

    public static void main(String args[]){

        //定义好一个要生产的Pizza

        //new 一个工厂对象来进行生产,然后可以直接调用Pizza类中的生产方法

        Factory f = new Factory();

        Pizza pizza = f.producntPizza("b");

        pizza.createPizza();

    }

}

```


上述方法是简单工厂:违反了卡比原则(对扩展开发,对修改关闭)

下面介绍比这个方法效率稍微高些的工厂方法

/*

*工厂方法

*/publicclassPizzaTest{publicstaticvoidmain(String[] args){        PizzaFactory pizzaFactory =newChinesePizzaFactory();        Pizza pizza = pizzaFactory.getPizza();        System.out.println(pizza);    }}//定义Pizza类classPizza{}//后面定义相应具体类去继承实现其中的方法等classChinesePizzaextendsPizza{}classEnglandPizzaextendsPizza{}//定义抽象Pizza工厂并定义方法abstractclassPizzaFactory{publicabstractPizzagetPizza();}//需要相应的工厂进行定义去实现classChinesePizzaFactoryextendPizzaFactory{@OverridepublicPizzagetPizza(){returnnewChinesePizza();    }}classEnglandPizzaFactoryextendPizzaFactory{@OverridepublicPizzagetPizza(){returnnewEnglandPizza();    }}

以上就是工厂方法:

优点:

1.在工厂方法中,用户只需要知道所要产品的具体工厂,不用关心具体的创建过程,甚至不需要具体产品类的类名。

2.在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,不用对原来的工厂进行修改,更好的符合“开闭原则”

缺点:

每次增加产品时都需要增加一个具体类和对象来实现工厂,这样系统中的类会成倍的增加,在一定程度上增加了系统的复杂度,同时也增加了系统对实体类的依赖,并不是一个很好的方法;但是比起简单工厂来说是不错的

综上我们在介绍一个方法:抽象工厂方法

/*

*抽象工厂(生产产品族,不添加成品)

*/publicclassPizza{}publicclassMantou{}//分别继承publicclassChinesePizzaextendsPizza{}publicclassChineseMantouextendsPizza{}//定义一个抽象工厂publicabstaicclassFactory{publicabstractPizzacreatePizza();publicabstractMantoucreateMantou();}//定义具体工厂publicclassChineseFactoryextendsFactory{@OverridepublicPizzacreatePizza()[        return newChinesePizza();    ]@OverridepublicMantoucreateMantou(){// TODO Auto-generated method stubreturnnewChineseMantou();}}//定义测试类publicclassTest{publicstaticvoidmain(String[] args){//当使用时可以直接new 出来相应的类出来Factory f =newChineseFactory();        Mantou m = f.createMantou();        System.out.println(m);    }}

抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。

他的优点是隔离了具体类的生成,使得客户端不需要知道什么被创建;

缺点是新增新的行为会比较麻烦,当添加一个新的产品对象时,需要更改接口及其下所有子类

参与者:

AbsractFactory:抽象工厂,抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含了一组方法来用来生产产品;

ConcreateFactory:具体工厂,具体工厂是用于生产不同产品族,要创建一个产品,客户只需要使用其中一个工厂完全不需要实例化任何产品对象;

AbstractProduct:抽象产品,这是一个产品家族,每一个具体工厂都能产生一整组产品

Product::具体产品。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 什么是工厂设计模式? 将工厂提取成一个接口或抽象类,具体生产什么产品由子类决定,工厂设计模式是将拥有共性的产品抽象...
    Spring618阅读 1,846评论 0 0
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 4,130评论 0 1
  • 设计模式之——工厂模式 一、学习内容: 所有的 工厂模式 都是通过减少应用程序和具体类之间的依赖,促进松耦合。 所...
    FeidianJava阅读 2,600评论 0 0
  • 一.介绍 工厂设计模式的分类 1.简单工厂模式2.工厂方法模式3.抽象工厂模式 工厂设计模式在工作中的应用 1.s...
    叫我不矜持阅读 2,967评论 0 5
  • 前言 关于设计模式,是一个永远说不完的也说不清的话题。毕竟在编程的世界里,没有最好的设计模式,只有最合适的设计模式...
    VV木公子阅读 5,521评论 0 9

友情链接更多精彩内容