Java设计模式之创建型模式--工厂方法及抽象工厂模式

来源:互联网 发布:网络购物市场交易规模 编辑:程序博客网 时间:2024/06/07 23:04

一:工厂方法

1.我们先看类图

这里写图片描述

2.工厂方法是针对每一种产品提供一个工厂类,比如我是生产A类产品的,但是A类产品又分为google旗下和华为旗下,这是我需要提供两个工厂,每个工厂生产属于自己的产品A。

3.关于工厂,还有一个简单工厂就不介绍了,它只是在创建产品A的时候,传入不同的参数加以识别,从而创建相应的产品。在这里就不演示了。

4.工厂方法的代码如下:

//创建产品基类public interface ProdcutA {    void getName();}//创建Google和华为旗下的产品public class GoogleProductA implements ProdcutA {    @Override    public void getName() {        System.out.println("google公司下的产品A");    }}public class HuaWeiProductA implements ProdcutA {    @Override    public void getName() {        System.out.println("华为公司下的产品A");    }}//紧接着,我们定义一个生产产品A的工厂public interface IFactory {    ProdcutA createProductA();}//创建Google和华为工厂public class GoogleFatory implements IFactory {    @Override    public ProdcutA createProductA() {        return new GoogleProductA();    }}public class HuaWeiFatory implements IFactory {    @Override    public ProdcutA createProductA() {        return new HuaWeiProductA();    }}//测试 public static void main(String[] args) {        ProdcutA prodcutA;        //创建google工厂        IFactory factory = new GoogleFatory();        //google工厂生产产品A        prodcutA = factory.createProductA();        prodcutA.getName();        //创建华为工厂        factory = new HuaWeiFatory();        //华为工厂生产产品A        prodcutA = factory.createProductA();        prodcutA.getName();    }    //结果    google公司下的产品A    华为公司下的产品A

5.小结

所以对于工厂方法,我们可以增加同一等级下的任意产品,比如这是我们又需要增加OPPO公司下的产品A,这时,我们只需创建OPPO下的产品A和OPPO工厂即可,不需要修改原有的类。但是工厂方法只局限于同一等级的产品。如果我们需要每个公司都要生产产品A,B。(比如A表示手机,B表示汽车)他们属于不同等级的。那么我们用工厂方法无法实现,这时我们就需要抽象工厂来实现了。下面介绍一下抽象工厂。

二:抽象工厂模式

1.我们还是先看类图

这里写图片描述

2.抽象工厂是针对产品族而生,我们可以创建A,B…一系列的产品,我们可以很容易的增加产品线。比如原本Google只生产产品A,当Google能生产产品B时,这时我们只需新建一个Google产品B的工厂就行了。不需要修改IFactory中的任何东西。

3.下面看一下源码:

//创建产品//产品A,产品A与上述一致//产品Bpublic interface ProdcutB {    void getName();}//具体的产品public class GoogleProductB implements ProdcutB {    @Override    public void getName() {        System.out.println("google公司下的产品B");    }}public class HuaWeiProductB implements ProdcutB {    @Override    public void getName() {        System.out.println("华为公司下的产品B");    }}//创建工厂//首先是抽象工厂,提供生产产品A,B的方法public interface IFactory {    ProdcutA createProductA();    ProdcutB createProductB();}//接着创建具体的工厂,google工厂和华为工厂public class GoogleFatory implements IFactory {    @Override    public ProdcutA createProductA() {        return new GoogleProductA();    }    @Override    public ProdcutB createProductB() {        return new GoogleProductB();    }}public class HuaWeiFatory implements IFactory {    @Override    public ProdcutA createProductA() {        return new HuaWeiProductA();    }    @Override    public ProdcutB createProductB() {        return new HuaWeiProductB();    }}//测试public static void main(String[] args) {        //工厂        IFactory factory;        //产品A        ProdcutA prodcutA;        //产品B        ProdcutB prodcutB;        //创建google工厂        factory = new GoogleFatory();        //google工厂生产产品A和B        prodcutA = factory.createProductA();        prodcutB = factory.createProductB();        prodcutA.getName();        prodcutB.getName();        //创建华为工厂        factory = new HuaWeiFatory();        //华为工厂生产产品A和B        prodcutA = factory.createProductA();        prodcutB = factory.createProductB();        prodcutA.getName();        prodcutB.getName();    }    //结果    google公司下的产品A    google公司下的产品B    华为公司下的产品A    华为公司下的产品B

4.小结

前面也说了,抽象工厂是针对产品族的。虽然我们能很好的处理新的产品族,如果我们新增一类产品C,我们还是没有办法去不修改基类的情况来实现,但这样又违背开闭原则(OCP),所以,这也是抽象工厂的缺点之一。

三:总结

简单工厂实用性实在太低了,所以一般我们也会选择工厂方法/抽象工厂。因为简单工厂动不动就违背了开闭原则。对于工厂方法和抽象工厂,我们视情况而用,如果只是生产这一类的产品(如不同公司下的产品A),那么我们就选用工厂方法;如果是一系列的产品(如不同公司下的产品A,B...),那么我们选用抽象工厂。
阅读全文
0 0
原创粉丝点击