您的位置:首页 > 编程语言 > Java开发

java设计模式(三)--抽象工厂模式

2017-08-02 00:00 441 查看
对于抽象工厂(Abstract Factory)设计模式,我认为是对工厂模式的提高,它提供了一种创建对象的最佳方式,在这个模式中,接口成了创建具体对象的工厂,不需要之前通过每次的new对象来完成对对象的实例化,而是将这种new对象的工作交给了工厂,可以说,工厂掌控了对象产生的权力,通过工厂来对所需要的对象进行实例化。
这种模式强调接口编程,模式中大量使用接口,来降低各个类之间的耦合度。

实例:
实现对形状和颜色的创建的程序编写。




1.创建形状接口:

public interface Shape {
void draw();
}

2.实现形状接口,完成正方形和矩形类的创建

public class Square implements Shape {
[@Override](https://my.oschina.net/u/1162528)
public void draw() {
System.out.println("正方形");
}
}

public class Rectangle implements Shape {
[@Override](https://my.oschina.net/u/1162528)
public void draw() {
System.out.println("矩形");
}
}

3.创建颜色接口

public interface Color {
void fill();
}

4.实现颜色接口,完成绿色和红色类的创建

public class Green implements Color {
[@Override](https://my.oschina.net/u/1162528)
public void fill() {
System.out.println("绿色");
}
}
public class Red implements Color {
[@Override](https://my.oschina.net/u/1162528)
public void fill() {
System.out.println("红色");
}
}

5.创建抽象工厂

public interface  AbstractFactory {
public	Color getColor(String color);
public	Shape getShpae(String shape);
}

6.实现抽象工厂,编写能够创建形状和颜色工厂的两个类

public class ColorFactory implements AbstractFactory {
[@Override](https://my.oschina.net/u/1162528)
public Shape getShpae(String shape) {
return null;
}
@Override
public Color getColor(String color) {
if(color==null){
return null;
}else{
if(color.equalsIgnoreCase("green")){
return new Green();
}else if(color.equalsIgnoreCase("red")){
return new Red();
}else{
return null;
}
}
}
}
public class ShapeFactory implements AbstractFactory{
@Override
public Color getColor(String color) {
return null;
}
@Override
public Shape getShpae(String shape) {
if(shape==null){
return null;
}else{
if(shape.equalsIgnoreCase("square")){
return new Square();
}else if(shape.equalsIgnoreCase("rectangle")){
return new Rectangle();
}else{
return null;
}
}
}
}

7.通过传参实现对抽象工厂的创建

public class FactoryProducer {
public static AbstractFactory getFactory(String type){
if(type==null){
return null;
}else{
if(type.equalsIgnoreCase("shape")){
return new ShapeFactory();
}else if(type.equalsIgnoreCase("color")){
return new ColorFactory();
}else{
return null;
}
}
}
}

8.测试

public class Test {
public static void main(String[] args) {
AbstractFactory abstractFactory=FactoryProducer.getFactory("shape");
Shape shape1=abstractFactory.getShpae("square");
shape1.draw();
Shape shape2=abstractFactory.getShpae("rectangle");
shape2.draw();

AbstractFactory abstractFactory2=FactoryProducer.getFactory("color");
Color color1=abstractFactory2.getColor("green");
color1.fill();
Color color2=abstractFactory2.getColor("red");
color2.fill();
}
}

9.后台输出

正方形
矩形
绿色
红色

优点:通过这种工厂的设计模式,可以通过对工厂中方法的调用来完成指定对象的实例化,通过一个String的参数的传递,就能完成指定类的创建,简化了编码工作量。
缺点:这种模式不利于后期的扩展,如果有扩展的具体类需要加入的话,要修改好多的类中的内容(与抽象工厂有关的类都需要修改,加大了工作难度)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息