设计模式之抽象工厂模式

来源:互联网 发布:矩阵没有分配律 编辑:程序博客网 时间:2024/06/16 12:44

定义

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

结构图

这里写图片描述

代码框架

//抽象类A或者接口Apublic abstract class AbstractProductA {}//抽象类B或者接口Bpublic abstract class AbstractProductB {}//A和B的一系列产品public class ProductA1 extends AbstractProductA{}public class ProductA2 extends AbstractProductA{}public class ProductB1 extends AbstractProductB{}public class ProductB2 extends AbstractProductB{}//定义工厂方法public abstract class AbstractFactory {    public abstract AbstractProductA createProductA();    public abstract AbstractProductB createProductB();}public class ConcreteFactory1 extends AbstractFactory {    @Override    public AbstractProductA createProductA() {        // TODO Auto-generated method stub        return new ProductA1();    }    @Override    public AbstractProductB createProductB() {        // TODO Auto-generated method stub        return new ProductB1();    }}public class ConcreteFactory2 extends AbstractFactory{    @Override    public AbstractProductA createProductA() {        // TODO Auto-generated method stub        return new ProductA2();    }    @Override    public AbstractProductB createProductB() {        // TODO Auto-generated method stub        return new ProductB2();    }}//Client类public class Client {    public static void main(String[] args)    {        //以ConcreteFactory1为例        AbstractFactory factory = new ConcreteFactory1();//      AbstractFactory factory = new ConcreteFactory2();        AbstractProductA productA = factory.createProductA();        AbstractProductB productB = factory.createProductB();    }}

优点和缺点

第一点:易于交换产品系列,AbstractFactory factory = new ConcreteFactory1();在一个产品应用中啦,只需要初始化的时候出现一次就可以了,这就使得改变一个应用的具体的工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
第一点:它让具体的创建实例过程和客户端Client分离,客户端是通过他们的抽象接口操作实例,产品的具体类名,如(ProductA1,Product1A2,ProductB1..)。也被具体工厂的实现分离,不会出现在客户代码中
缺点:如果需求要改了,需要增加新的功能,比如添加新的产品C,那么就要添加好几个类,放项目工程很大的时候,就需要添加很多类。还有就是不止有一个Client客户端,会有很多个,那么比如的AbstractFactory factory = new ConcreteFactory1();就会调用很多次,比如100个Client就要调用100次.

解决方案

一:用简单工厂来封装:

结构图
这里写图片描述
代码

public class SimpleFactory {    private static String db;    public SimpleFactory(String s) {        // TODO Auto-generated constructor stub        this.db = s;    }    public static AbstractProductA createProductA()     {        AbstractProductA result = null;        switch (db) {        case "1":            result = new ProductA1();            break;        case "2":            result = new ProductA2();        default:            break;        }        return result;    }    public static AbstractProductB createProductB()    {        AbstractProductB result = null;        switch (db) {        case "1":            result = new ProductB1();            break;        case "2":            result = new ProductB2();        default:            break;        }        return result;    }}public class Client {    public static void main(String[] args)    {        SimpleFactory factory = new SimpleFactory("1");        //以产品1为例        AbstractProductA productA = factory.createProductA();        AbstractProductB productB = factory.createProductB();    }}

二:利用反射机制,动态的生成需要的产品类

public class AbstractFactory{    private String s;    public AbstractFactory(String s)    {        this.s = s;    }    public AbstractProductA createProductA()    {        return (AbstractProductA) Class.forName("ProductA"+s).newInstance();    }    public AbstractProductB createProductB()    {        return (AbstractProductB) Class.forName("ProductB"+s).newInstance();    }}class Client{    public static void main()    {        AbstractFactory factory = new AbstractFactory("1");        AbstractProductA productA = factory.createProductA();        AbstractProductB productB = factory.createProductB();    }}

在客户端没有出现,ProductA等具体类的字样,达到了解耦的目的…

0 0
原创粉丝点击