zoukankan      html  css  js  c++  java
  • java抽象工厂模式

    意图:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
    适用性:
    1、一个系统要独立于它的产品的创建、组合和表示时。
    2、一个系统要由多个产品系列中的一个来配置时。
    3、当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    4、当你提供一个产品类库,而只想显示它们的接口而不是实现时。
    结构图:

     

    实例:

    1 package com.test.patten.adstractfactory;
    2 
    3 public interface AbstractFactory {
    4     AbstractProductA createProductA();
    5     AbstractProductB createProductB();
    6 }
     1 package com.test.patten.adstractfactory;
     2 
     3 public class ConcreteFactory1 implements AbstractFactory {
     4 
     5     @Override
     6     public AbstractProductA createProductA() {
     7         return new ProductA1();
     8     }
     9 
    10     @Override
    11     public AbstractProductB createProductB() {
    12         return new ProductB1();
    13     }
    14 }
     1 package com.test.patten.adstractfactory;
     2 
     3 public class ConcreteFactory2 implements AbstractFactory {
     4 
     5     @Override
     6     public AbstractProductA createProductA() {
     7         return new ProductA2();
     8     }
     9 
    10     @Override
    11     public AbstractProductB createProductB() {
    12         return new ProductB2();
    13     }
    14 }
    1 package com.test.patten.adstractfactory;
    2 
    3 public interface AbstractProductA {
    4 
    5 }
    1 package com.test.patten.adstractfactory;
    2 
    3 public interface AbstractProductB {
    4 
    5 }
    1 package com.test.patten.adstractfactory;
    2 
    3 public class ProductA1 implements AbstractProductA {
    4     
    5     public ProductA1() {
    6         System.out.println("我是产品A1");
    7     }
    8     
    9 }
    1 package com.test.patten.adstractfactory;
    2 
    3 public class ProductA2 implements AbstractProductA {
    4 
    5     public ProductA2() {
    6         System.out.println("我是产品A2");
    7     }
    8     
    9 }
    1 package com.test.patten.adstractfactory;
    2 
    3 public class ProductB1 implements AbstractProductB {
    4     
    5     public ProductB1() {
    6         System.out.println("我是产品B1");
    7     }
    8     
    9 }
    1 package com.test.patten.adstractfactory;
    2 
    3 public class ProductB2 implements AbstractProductB {
    4     
    5     public ProductB2(){
    6         System.out.println("我是产品B2");
    7     }
    8     
    9 }
     1 package com.test.patten.adstractfactory;
     2 
     3 public class Client {
     4     public static void main(String args[]){
     5         //我需要ProductA1,ProductB1来完成我的项目
     6         AbstractFactory f1 = new ConcreteFactory1();
     7         AbstractProductA a1 = f1.createProductA();
     8         AbstractProductB b1 = f1.createProductB();
     9         
    10         //我需要ProductA2,ProductB2来完成我的项目
    11         AbstractFactory f2 = new ConcreteFactory2();
    12         AbstractProductA a2 = f2.createProductA();
    13         AbstractProductB b2 = f2.createProductB();
    14     }
    15 }

    输出:

    我是产品A1
    我是产品B1
    我是产品A2
    我是产品B2

    抽象工厂与工厂方法的异同:
    1、抽象工厂和工厂方法都用来创建对象,抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的的方法中;工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象
    2、抽象工厂用来创建整个产品家族和将制造的相关产品集合起来,故当要改变产品时(新增,修改)就必须改变接口,抽象工厂中的产品经常会用工厂方法实现;工厂方法将客户代码从需要实例化的具体子类中解耦,或者目前还不知道将来需要实例化那些具体类时使用

  • 相关阅读:
    回溯法之迷宫问题
    一个.net的正则表达式测试工具
    关于FeedSky话题广告
    google notebook更新了&digg notebook
    近日,来北京近一月
    城堡技术论坛(castle.org.cn)上线!
    玉龙雪山
    消息队列(Message Queue)
    Mac Theme for Google Reader
    开始学习npetshop2
  • 原文地址:https://www.cnblogs.com/ikuman/p/2922622.html
Copyright © 2011-2022 走看看