设计模式系列 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
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值