1.简单工厂模式

  1. interface Product {
  2. public void setName();
  3. }
  4. class ProductA implements Product {
  5. @Override
  6. public void setName() {
  7. System.out.println("set name ProductA");
  8. }
  9. }
  10. class ProductB implements Product {
  11. @Override
  12. public void setName() {
  13. System.out.println("set name ProductB");
  14. }
  15. }
  16. class ProductFactory{
  17. public static Product createProduct(String type){
  18. if(type.equals("A")){
  19. return new ProductA();
  20. }
  21. else if(type.equals("B")){
  22. return new ProductB();
  23. }
  24. else{
  25. return null;
  26. }
  27. }
  28. }
  29. public class FactoryTest {
  30. public static void main(String[] args) {
  31. Product product = ProductFactory.createProduct("A");
  32. product.setName();
  33. }
  34. }

2.工厂方法模式,让一个类的实例化延迟到子类

  1. abstract class AbsProduct{
  2. abstract Product productCreat();
  3. }
  4. class ConCreateProductA extends AbsProduct{
  5. @Override
  6. Product productCreat() {
  7. return new ProductA();
  8. }
  9. }
  10. class ConCreateProductB extends AbsProduct{
  11. @Override
  12. Product productCreat() {
  13. return new ProductB();
  14. }
  15. }
  16. public class FactoryTest {
  17. public static void main(String[] args) {
  18. Product product = ProductFactory.createProduct("A");
  19. product.setName();
  20. AbsProduct absProduct = new ConCreateProductA();
  21. Product product1 = absProduct.productCreat();
  22. product1.setName();
  23. }
  24. }

应用场景
1.当你不知道改使用对象的确切类型的时候
2.当你希望为库或框架提供扩展其内部组件的方法时

主要优点:
1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则

源码中的应用:
1//javaapi
2//静态工厂方法
3Calendar.getInstance()
4java.text.NumberFormat.getInstance()
5java.util.ResourceBundle.getBundle()
6//工厂方法
7java.net.URLStreamHandlerFactory10javax.xml.bind.JAXBContext.createMarshaller

3.抽象工厂模式

抽象工厂模式定义:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类,注意,千万别误以为抽象工厂就必须要和abstract抽象类有关系。
其实就是定义一组接口由不同的产品去实现。如下面定义了三个接口,由mysql和oracle分别去实现。
开发需求:开发一个数据库的连接组件

  1. interface IConnection{
  2. void connect();
  3. }
  4. interface ICommand{
  5. void command();
  6. }
  7. interface IDataBaseUtil{
  8. IConnection getConnection();
  9. ICommand getCommand();
  10. }
  11. class MysqlConnection implements IConnection{
  12. @Override
  13. public void connect() {
  14. System.out.println("Mysql connected");
  15. }
  16. }
  17. class MysqlCommand implements ICommand{
  18. @Override
  19. public void command() {
  20. System.out.println("Mysql command");
  21. }
  22. }
  23. class MysqlDataBaseUtil implements IDataBaseUtil{
  24. @Override
  25. public IConnection getConnection() {
  26. return new MysqlConnection();
  27. }
  28. @Override
  29. public ICommand getCommand() {
  30. return new MysqlCommand();
  31. }
  32. }
  33. class OracleConnection implements IConnection{
  34. @Override
  35. public void connect() {
  36. System.out.println("Oracle connected");
  37. }
  38. }
  39. class OracleCommand implements ICommand{
  40. @Override
  41. public void command() {
  42. System.out.println("Oracle command");
  43. }
  44. }
  45. class OracleDataBaseUtil implements IDataBaseUtil{
  46. @Override
  47. public IConnection getConnection() {
  48. return new OracleConnection();
  49. }
  50. @Override
  51. public ICommand getCommand() {
  52. return new OracleCommand();
  53. }
  54. }
  55. public class AbstractFactoryTest {
  56. public static void main(String[] args) {
  57. IDataBaseUtil iDataBaseUtil = new OracleDataBaseUtil();
  58. IConnection connection = iDataBaseUtil.getConnection();
  59. connection.connect();
  60. ICommand command = iDataBaseUtil.getCommand();
  61. command.command();
  62. }
  63. }

应用场景:
程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的具体类时,可以使用抽象工厂

优点:
1.可以确信你从工厂得到的产品彼此是兼容的。
2.可以避免具体产品和客户端代码之间的紧密耦合。
3.符合单一职责原则
4.符合开闭原则

JDK源码中的应用:
1java.sql.Connection
2java.sql.Driver