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