《设计模式》之抽象工厂模式(Abstract Factory)

Posted zjh-ds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《设计模式》之抽象工厂模式(Abstract Factory)相关的知识,希望对你有一定的参考价值。

仅供自己参考,因初次,有很多东西都只是我自己的理解,如想学习请找下一家。

1、简介

  他主要面对的问题是多产品等级结构的系统设计。

  首先要明白两个概念:产品族和产品等级。

  产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:

技术分享图片

  理解这个产品结构是理解抽象工厂模式的关键所在,从上图可以看出,抽象工厂模式的每个工厂创造出来的都是一族产品,而不是一个或者一组。组是可以随意组合的!其实工厂方法模式和抽象工厂模式就这点点差别。

  概念:提供了一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类。

2、自己的理解

  理解不了。

3、代码

 技术分享图片

  包名啥的。

  抽象类(department接口)

package AbstractFactory.abstractproduct;

/**
 * 
 * 抽象产品类:department接口
 *
 * @author hezejun
 * @version C10 2018年1月2日*/
public interface IDepartment
{
    
}

  抽象类(user接口)

package AbstractFactory.abstractproduct;
/**
 * 
 * c抽象产品:User接口
 *
 * @author hezejun
 * @version C10 2018年1月2日
 */
public interface IUser
{
    
}

  具体实现类

  实现User接口

package AbstractFactory.concreteproduct;

import AbstractFactory.abstractproduct.IUser;

public class mysqlOfUser implements IUser
{
    public MySqlOfUser()
    {
        System.out.println("MySqlOfUser工厂:在MySqlOfUser中操作User表");
    }
}
package AbstractFactory.concreteproduct;

import AbstractFactory.abstractproduct.IUser;

public class MySqlOfUser implements IUser
{
    public MySqlOfUser()
    {
        System.out.println("MySqlOfUser工厂:在MySqlOfUser中操作User表");
    }
}

  实现department接口

package AbstractFactory.concreteproduct;

import AbstractFactory.abstractproduct.IDepartment;

public class MySqlOfDepartment implements IDepartment
{
    public MySqlOfDepartment()
    {
        System.out.println("MySql工厂:在MySql中操作Department表");
    }
}
package AbstractFactory.concreteproduct;

import AbstractFactory.abstractproduct.IDepartment;

public class OracleOfDepartment implements IDepartment
{
    public OracleOfDepartment()
    {
        System.out.println("Oracle工厂:在Oracle中操作Department表");
    }
}

  抽象工厂接口

package AbstractFactory.abstractFactory;

import AbstractFactory.abstractproduct.IDepartment;
import AbstractFactory.abstractproduct.IUser;

public interface IDBFactory
{
    public IUser createUser();
    
    public IDepartment createDepartment();
}

  抽象工厂具体实现

 

package AbstractFactory.concretefactory;

import AbstractFactory.abstractFactory.IDBFactory;
import AbstractFactory.abstractproduct.IDepartment;
import AbstractFactory.abstractproduct.IUser;
import AbstractFactory.concreteproduct.MySqlOfDepartment;
import AbstractFactory.concreteproduct.MySqlOfUser;

public class MySqlFactory implements IDBFactory
{

    @Override
    public IUser createUser()
    {
        return new MySqlOfUser();
    }

    @Override
    public IDepartment createDepartment()
    {
        return new MySqlOfDepartment();
    }
    
}
package AbstractFactory.concretefactory;

import AbstractFactory.abstractFactory.IDBFactory;
import AbstractFactory.abstractproduct.IDepartment;
import AbstractFactory.abstractproduct.IUser;
import AbstractFactory.concreteproduct.OracleOfDepartment;
import AbstractFactory.concreteproduct.OracleOfUser;

public class OracleFactory implements IDBFactory
{
    
    @Override
    public IUser createUser()
    {
        return new OracleOfUser();
    }
    
    @Override
    public IDepartment createDepartment()
    {
        return new OracleOfDepartment();
    }
    
}

  客户端

package AbstractFactory.client;

import AbstractFactory.abstractproduct.IDepartment;
import AbstractFactory.abstractproduct.IUser;
import AbstractFactory.concretefactory.MySqlFactory;
import AbstractFactory.concretefactory.OracleFactory;

public class AbstractFactoryClient
{
    public static void main(String[] args)
    {
        System.out.println("-------------------------------\\n" + "AbstractFactory Patterns." + "\\n"
            + "-------------------------------");
        
        IUser oracleUser, mySqlUser;
        IDepartment oracleDepartment, mySqlDepartment;
        OracleFactory oracleFactory = new OracleFactory();
        MySqlFactory mySqlFactory = new MySqlFactory();
        
        oracleUser = oracleFactory.createUser();
        mySqlUser = mySqlFactory.createUser();
        oracleDepartment = oracleFactory.createDepartment();
        mySqlDepartment = mySqlFactory.createDepartment();
    }
}

  结果:

技术分享图片

4、总结

   第一,易于交换产品系列,由于具体工厂类,例如IDBFactory factory = new OracleFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它之需要改变具体工厂即可使用不同的产品配置。
   第二,它让具体的创建实例与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。

5、参考

  http://blog.csdn.net/cjjky/article/details/7346893

 



以上是关于《设计模式》之抽象工厂模式(Abstract Factory)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式---对象创建模式之抽象工厂模式(Abstract Factory)

设计模式从青铜到王者第七篇:创建型模式之抽象工厂模式(Abstract Factory)

35面向对象设计模式之抽象工厂(Abstract Factory)设计模式

《设计模式》之抽象工厂模式(Abstract Factory)

设计模式之抽象工厂模式

抽象工厂模式 (Abstract Factory Pattern)