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

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

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
这里写图片描述

posted on 2016-09-04 18:58  生活旅者  阅读(262)  评论(0编辑  收藏  举报