zoukankan      html  css  js  c++  java
  • 设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)

    本文出自
    代码大湿
    代码大湿

    本系列持续更新,敬请关注。

    1 静态工厂

    静态工厂介绍:

    静态工厂模式可以实现接口封装隔离的原则。在客户端只知接口而不知实现的时候可以使用静态工厂模式。
    

    源码请点击我

    角色:

    Product:客户端需要使用的接口。 
    
    ConcreteProduct:Product的具体实现。
    
    Factory:拥有静态方法的工厂类,返回ConcreteProduct实例。
    
    Client:只知到Product。但是并不知道具体实现。
    

    UML:

    这里写图片描述

    code:

    package 设计模式.staticFactary;
    /*
     *2016年8月26日	上午10:15:22
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public interface Product {
    	public void operation();
    
    }
    
    
    package 设计模式.staticFactary;
    /*
     *2016年8月26日	上午10:15:00
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class ConcreteProduct implements Product{
    
    	@Override
    	public void operation() {
    		System.out.println("我是具体产品中的实现方法");
    	}
    }
    
    
    package 设计模式.staticFactary;
    /*
     *2016年8月26日	上午10:47:01
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class Factory {
    	public static Product getProduct(){
    		return new ConcreteProduct();
    	}
    }
    
    
    package 设计模式.staticFactary;
    /*
     *2016年8月26日	上午10:48:05
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class Client {
    
    	public static void main(String[] args) {
    		Product product=Factory.getProduct();
    		product.operation();
    	}
    }
    
    

    2 AbstractFactory(抽象工厂)

    AbstractFactory介绍:

    AbstractFactory是为一系列相关的或者相互依赖的类创建接口,客户端不用关注他们的实现。相当如一个AbstractFactory的实现创建一个产品族。
    

    AbstractFactory角色:

    abstractProduct:抽象产品类。
    ConcreteProduct:具体的产品实现。
    abstractFactory:抽象工厂。
    ConcreteFactory:具体的工厂实现。
    

    UML:
    这里写图片描述

    源码点击我

    场景:选用不同的方案来装机,主要是让cpu和主板配套。

    code:

    abstractProduct

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:18:46
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public interface CpuAPI {
    	public  void calculate();
    
    }
    
    

    abstractProduct

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:18:46
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public interface MainBoardAPI {
    	void install();
    }
    
    

    ConcreteProduct

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:20:38
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class IntellCpu implements CpuAPI{
    	Integer cpuPins;
    	public IntellCpu(Integer pins) {
    		cpuPins=pins;
    	}
    	@Override
    	public void calculate() {
    		System.out.println("Intell cpu 正在计算....."+"pins:"+cpuPins);
    	}
    
    }
    
    

    ConcreteProduct

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:20:38
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    
    public class AMDCpu implements CpuAPI{
    	Integer cpuPins;
    	public AMDCpu(Integer pins) {
    		cpuPins=pins;
    	}
    	@Override
    	public void calculate() {
    		System.out.println("AMD cpu 正在计算....."+"pins:"+cpuPins);
    	}
    
    }
    
    
    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:24:25
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    
    ConcreteProduct
    //技嘉主板
    public class GigaMainboard implements MainBoardAPI{
    	//插入cpu的接口pin数
    	Integer pins ;
    	public GigaMainboard(Integer pins) {
    		this.pins=pins;
    	}
    	
    	@Override
    	public void install() {
    		System.out.println("技嘉主板正在安装.....pin数:"+pins);
    	}
    	
    }
    
    

    ConcreteProduct

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:24:25
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    
    
    //微星主板
    public class MSIMainboard implements MainBoardAPI{
    	//插入cpu的接口pin数
    	Integer pins ;
    	public MSIMainboard(Integer pins) {
    		this.pins=pins;
    	}
    	
    	@Override
    	public void install() {
    		System.out.println("微星主板正在安装.....pin数:"+pins);
    	}
    	
    }
    
    

    AbstractFactory

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:29:07
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public interface AbstractFactory {
    	CpuAPI createCPU();
    	MainBoardAPI createMainBoardAPI();
    }
    
    

    ConcreteFactory

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:31:01
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class ConcreteFactoryA implements AbstractFactory{
    
    	@Override
    	//intell cpu
    	public CpuAPI createCPU() {
    		return new IntellCpu(1156);
    	}
    
    	//技嘉主板
    	@Override
    	public MainBoardAPI createMainBoardAPI() {
    		return new GigaMainboard(1156);
    	}
    	
    
    }
    
    

    ConcreteFactory

    package 设计模式.abstractFactory;
    /*
     *2016年9月2日	上午10:31:01
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class ConcreteFactoryB implements AbstractFactory{
    
    	@Override
    	//AMD cpu
    	public CpuAPI createCPU() {
    		return new AMDCpu(939);
    	}
    
    	//微星主板
    	@Override
    	public MainBoardAPI createMainBoardAPI() {
    		return new MSIMainboard(939);
    	}
    	
    
    }
    
    

    Client

    package 设计模式.abstractFactory;
    
    /*
     *2016年9月2日	上午10:39:15
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class Engineer {
    	AbstractFactory schemal;
    
    	public Engineer(AbstractFactory schemal) {
    		this.schemal = schemal;
    	}
    
    	public void setSchemal(AbstractFactory schemal) {
    		this.schemal = schemal;
    	}
    
    	public void makeAndUseComputer(){
    		CpuAPI cpu=schemal.createCPU();
    		MainBoardAPI mainBoard=schemal.createMainBoardAPI();
    		cpu.calculate();
    		mainBoard.install();
    	}
    
    }
    
    
    package 设计模式.abstractFactory;
    
    import static org.junit.Assert.*;
    
    import java.nio.channels.NonWritableChannelException;
    
    import javax.swing.border.AbstractBorder;
    
    import org.junit.Test;
    
    /*
     *2016年9月2日	上午10:35:51
     *@Author Pin-Wang
     *@E-mail 1228935432@qq.com
    */
    public class Client {
    
    	@Test
    	public void test() {
    		System.out.println("装机方案A");
    		//装机模式1
    		AbstractFactory schemalA=new ConcreteFactoryA();
    		Engineer engineer=new Engineer(schemalA);
    		engineer.makeAndUseComputer();
    		
    		System.out.println("装机方案B");
    		//装机模式2
    		AbstractFactory schemalB=new ConcreteFactoryB();
    		engineer.setSchemal(schemalB);
    		engineer.makeAndUseComputer();
    	}
    
    }
    
    

    output:

    装机方案A
    Intell cpu 正在计算.....pins:1156
    技嘉主板正在安装.....pin数:1156
    装机方案B
    AMD cpu 正在计算.....pins:939
    微星主板正在安装.....pin数:939
    
    

    本文出自
    代码大湿
    代码大湿

    欢迎与广大coder交流技术
    QQ:1228935432
    WX:WX1228935432
    这里写图片描述

  • 相关阅读:
    Internet protocol optimizer
    SQl常用语句总结(持续更新……)
    让 步( 写的太好了!)
    让 步( 写的太好了!)
    让 步( 写的太好了!)
    $.ajax()参数详解及标准写法
    $.ajax()参数详解及标准写法
    $.ajax()参数详解及标准写法
    JQuery函数attr()和prop()的区别
    公司来了个傻员工,改变了所有聪明的员工
  • 原文地址:https://www.cnblogs.com/pin-wang/p/5839984.html
Copyright © 2011-2022 走看看