码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-01-24 20:02:57      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:ati   操作   abstract   fuse   ref   具体类   bubuko   简介   dbf   

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

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)

标签:ati   操作   abstract   fuse   ref   具体类   bubuko   简介   dbf   

原文地址:https://www.cnblogs.com/zjh-ds/p/8342629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!