java的设计模式详解

java23模式

创建型模式 5种




1.抽象工厂模式

1.啥是抽象工厂

抽象工厂就是一个超级工厂,用来创建其他工厂的一个工厂,因为他是创建其他工厂的工厂,所以他属于创建型的模式。

抽象工厂中接口负责创建一个相关对象的工厂,不需要指定他们的类,每个生成的工厂都会按照工厂模式给我们提供对象

目的:

给我们提供一个创建系列的相关或者相互依赖的接口,而无需指定他们的具体的类。因此他解决接口选择的问题。关键在于一个工厂中聚合多个同类产品,就是一个产品族里定义多个产品型号。

例如我家很钱,我有很多品牌的汽车,有奔驰、有牧马人、我的牧马人仓库只放置牧马人,奔驰车库只能停置奔驰。我所有的车库就是一个抽象工厂(接口),我具体的牧马人车库就是个具体的工厂,还有我的奔驰汽车又有不同型号,不同型号的奔驰又组成一个抽象产品。

优点:

产品族中多个对象被设计成在一起工作时,它能保证客户端始终使用同一个产品族中的对象 。

缺点:

扩展一个产品族太困难,因为扩展一个产品系既要在抽象块中编写代码,又要在具体的产品工厂中添加代码。



实现
步骤一:创建产品接口以及产品的方法
public interface Color {
    //颜色填充
    void fill();
}
//2
public interface Shape {
    //形状接口
    void draw();
}
步骤二:分别创建颜色、形状的实现类,实现方法
public class Blue implements Color {

    @Override
    public void fill() {
        System.out.println("填充蓝色Blue.fill");
    }
}
public class Green implements Color {

    @Override
    public void fill() {
        System.out.println("填充绿色Green.fill");
    }
}


Red

---
Shape:
public class Circle implements Shape{

    @Override
    public void draw() {
        System.out.println("画原型方法Circle.draw");
    }
}
Rectangle
Square
步骤三:创建颜色形状抽象工厂
public abstract class AbstractFactory {
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shape);
}
步骤四:分别用颜色形状工厂实现抽象工厂
public class ColorFactory extends AbstractFactory {

    @Override
    public Color getColor(String color) {
        // todo color
        if (color==null){
            return null;
        }
        if (color.equals("RED")){
            return new Red();
        }else if (color.equals("Green")){
            return new Green();
        }else if (color.equals("Blue")){
            return new Blue();
        }
        return null;
    }

    @Override
    public Shape getShape(String shape) {

        return null;
    }
}

---
public class ShapeFactory extends AbstractFactory {

    @Override
    public Color getColor(String color) {

        return null;
    }

    @Override
    public Shape getShape(String shape) {
        //TODO shanpe
        if (shape==null){
            return null;
        }if (shape.equals("Circle")){
            return new Circle();
        }else if (shape.equals("Rectangle")){
            return new Rectangle();
        }else if (shape.equals("Square")){
            return new Square();
        }
        return null;
    }
}    

步骤五:创建生产者
public class FactoryProducer {
    public static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("SHAPE")) {
            return new ShapeFactory();
        } else if (choice.equalsIgnoreCase("Rectangle")){
            return new ColorFactory();
        }
        return null;
    }
}
步骤六:测试
public class FactoryTest {
    public static void main(String[] args) {
        AbstractFactory abstractFactory = FactoryProducer.getFactory("SHAPE");
        Shape shape = abstractFactory.getShape("Square");
        shape.draw();
    }
}

**Result:**画正方形Square.draw

工厂方法模式

1.啥是工厂模式

工厂模式是最常用的一个创建型的设计模式,他不会暴露给客户端我们创建对象的创建逻辑,通过一个共同的接口来执行创建的对象。

目的

定义一个接口,让子类决定实例化哪个工厂类,是创建过程延迟到了子类中进行,解决了接口选择的问题。

例如:我们知道不同条件下生产不同对象,象我去面包店买面包,我们只需要拿面包,付钱就行,不用去管理面包的制作过程。

优点

  1. 访问者只需要告诉面包店面包的名字叫啥就行。
  2. 扩展容易,只需要扩展一个类就行了。
  3. 屏蔽了具体实现,调用者只用关心接口就行。

缺点

  1. 由于需要一个产品就要新创建一个类,使得类的数量太多,同时增加了欧耦合度。


实现
步骤一:创建产品接口
public interface Car {
    void run();
}
步骤二:创建实现类
public class Benz implements Car {

    @Override
    public void run() {
        System.out.println("奔驰Benz.run");
    }
}
---
BWM
Rabinson

步骤四:创建汽车工厂
public class CarFactory {
    public Car createCar(String car){
        if (car==null){
            return null;
        }
        if (car.equalsIgnoreCase("benz")){
            return new Benz();
        }else if (car.equalsIgnoreCase("bwm")){
            return new BWM();
        }else if (car.equalsIgnoreCase("rabinson")){
            return new Rabinson();
        }
        return null;
    }
}
步骤五:创建测试类
public class CarTest {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        Car benz = carFactory.createCar("benz");
        benz.run();
    }
}

result

奔驰Benz.run

后续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值