您的位置:首页 > 其它

设计模式系列 1——StaticFactory(静态工厂),AbstractFactory(抽象工厂)

2016-09-04 18:58 507 查看
本文出自

代码大湿

代码大湿

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

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: