zoukankan      html  css  js  c++  java
  • 设计模式04_抽象工厂模式

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/46440915



    抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广。




    抽象工厂模式与工厂方法模式的最大差别就在于工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则须要面对多个产品等级结构。



    如果一个子系统须要一些产品对象,而这些产品又属于一个以上的产品等级结构。

    那么为了将消费这些产品对象的责任和创建这些产品对象的责任切割开来。能够引进抽象工厂模式。

    这种话。消费产品的一方不须要直接參与产品的创建工作,而仅仅须要向一个公用的工厂接口请求所须要的产品。


    长处:

    (1)分离接口和实现
      client使用抽象工厂来创建须要的对象,而client根本就不知道详细的实现是谁,client仅仅是面向产品的接口编程而已。也就是说,client从详细的产品实现中解耦。

    (2)使切换产品族变得easy
      由于一个详细的工厂实现代表的是一个产品族,比方上面样例的从A产品到B产品仅仅须要切换一下详细工厂。



    缺点:
    (1)不太easy扩展新的产品
      假设须要给整个产品族加入一个新的产品,那么就须要改动抽象工厂,这样就会导致改动全部的工厂实现类。



    通过以下代码来熟悉抽象工厂模式:


    不同的抽象工厂:

    package com.design.abstractFactory;
    
    //每一种牌子的产品负责生产工厂。即不同的厂商负责自己牌子的生产
    public abstract class Factory1 {
    	abstract public IproductA getproductA1();
    	abstract public IproductB getProductB1();
    }
    
    package com.design.abstractFactory;
    
    public abstract class Factory2 {
    	abstract public IproductA getproductA2();
    	abstract public IproductB getproductB2();
    }
    

    不同的详细工厂:

    package com.design.abstractFactory;
    
    //详细的工厂生产产品
    public class ConcreateFactory1 extends Factory1 {
    
    	@Override
    	public IproductA getproductA1() {
    		return new ProductA1();
    	}
    
    	@Override
    	public IproductB getProductB1() {
    		return new ProductB1();
    	}
    
    }
    
    package com.design.abstractFactory;
    
    public class ConcreateFactory2  extends Factory2{
    
    	@Override
    	public IproductA getproductA2() {
    		return new ProductA2();
    	}
    
    	@Override
    	public IproductB getproductB2() {
    		return new ProductB2();
    	}
    }
    

    定义不同的产品接口:

    package com.design.abstractFactory;
    //定义不同的产品之间的一定具备的标准,用interface实现 
    public interface IproductA {
    	public void method();
    }
    
    package com.design.abstractFactory;
    
    public interface IproductB {
    	public void method();
    }
    

    不同的详细产品:

    package com.design.abstractFactory;
    
    //实现了产品标准实现的一系列详细产品
    public class ProductA1 implements IproductA {
    
    	@Override
    	public void method() {
    		System.err.println("A1产品生产A1");
    	}
    
    }
    
    package com.design.abstractFactory;
    
    public class ProductA2 implements IproductA {
    
    	@Override
    	public void method() {
    		System.err.println("A2生产产品A2");
    	}
    
    }
    

    package com.design.abstractFactory;
    
    public class ProductB1 implements IproductB {
    	@Override
    	public void method() {
    		System.err.println("B1生产产品B1");
    	}
    }
    
    package com.design.abstractFactory;
    
    public class ProductB2 implements IproductB {
    	@Override
    	public void method() {
    		System.err.println("B2生产产品B2");
    	}
    }
    

    client实现:

    package com.design.abstractFactory;
    
    public class Client {
    	public static void main(String[] args) {
    
    		Factory1 factory = new ConcreateFactory1();
    
    		IproductA a1 = factory.getproductA1();
    
    		IproductB b1 = factory.getProductB1();
    
    		a1.method();
    
    		b1.method();
    
    	}
    }
    

    測试结果:


    A1产品生产A1
    B1生产产品B1



  • 相关阅读:
    javaweb消息中间件——rabbitmq入门
    virtual box 桥接模式(bridge adapter)下无法获取ip(determine ip failed)的解决方法
    Apache Kylin本地启动
    git操作
    Java学习总结
    Java中同步的几种实现方式
    hibernate exception nested transactions not supported 解决方法
    vue 中解决移动端使用 js sdk 在ios 上一直报invalid signature 的问题解决
    cookie 的使用
    vue 专门为了解决修改微信标题而生的项目
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5090638.html
Copyright © 2011-2022 走看看