设计模式之工厂模式

一 简单工厂(静态工厂)

1.1 什么是简单工厂

就是一个可以根据客户端或者配置文件提供参数,从而选择创建不同对象的工厂模式。本质在于选择不同产品的实现。

特点: 不符合开闭原则;简单

场景: 适合明确知道未来产品类型很少变化的场景,平常使用的较多。

一般简单工厂我们都不需要实例化,我们可以把它实现成工具类,直接使用静态方法,所以简单工厂的方法通常都是静态的,也被称为静态工厂。

1.2 代码示例

public interface CPU {
    public void desc();
}



public class IntelCPU implements CPU {

    public void desc() {

        System.out.println("英特尔(Intel) i5 7500 酷睿四核 盒装CPU处理器");

    }

}
public class AMDCPU implements CPU{

    public void desc() {

        System.out.println("锐龙 AMD Ryzen 5 1600X 处理器6核AM4接口 3.6GHz 盒装");

    }

}
public class SimpleFactory {

    public static CPU createCPU(String brand) {

        if ("Intel".equals(brand)) {

            return new IntelCPU();

        } else if ("AMD".equals(brand)) {

            return new AMDCPU();

        }

        return null;

    }

}

二 工厂方法


2.1 什么工厂方法

即父类负责定义创建产品对象的公共接口,而工厂子类负责创建具体的产品对象,即将产品的实例化操作延迟到工厂子类,由子类决定到底实例化什么产品(而简单工厂没有子类,就是一个工厂类,然后提供一个方法实例化子类)。

特点: 符合开闭原则,新增加产品类型,不需要在修改已有的类,而是直接创建新的工厂子类,进行产品实例化;稍微有一点麻烦

场景: 适合产品类型未来不确定是不是需要增加

工厂可以有很多创建对象的抽象方法。交给工厂子类实现的它总共有四个角色:

抽象工厂,具体工厂,抽象产品,具体产品

2.2 代码示例

/** 支付渠道 */
public interface PayChannel {

    void pay(BigDecimal money);
}

public class AliPay implements PayChannel {
    @Override
    public void pay(BigDecimal money) {
        System.out.println("支付宝支付成功!支付金额:"+money);
    }
}

public class WeixinPay implements PayChannel {

    @Override
    public void pay(BigDecimal money) {
        System.out.println("微信支付成功!支付金额:"+money);
    }
}





public interface PayFactory {

    public PayChannel createPayChannel();
}



public class AlipayFactory implements PayFactory {
    @Override
    public PayChannel createPayChannel() {
        return new AliPay();
    }
}



public class WeixinPayFactory implements PayFactory {
    @Override
    public PayChannel createPayChannel() {
        return new WeixinPay();
    }
}



public class Client {
    public static void main(String[] args) {
        AlipayFactory alipayFactory = new AlipayFactory();
        PayChannel payChannel = alipayFactory.createPayChannel();
        payChannel.pay(new BigDecimal(100));
       
        WeixinPayFactory weixinPayFactory = new WeixinPayFactory();
        payChannel = weixinPayFactory.createPayChannel();
        payChannel.pay(new BigDecimal(200));
    }

三 抽象工厂

首先在这里我们需要明白2个概念,产品等级和产品簇

通常我们遇到可能需要创建一系列的对象,比如家里面装修,就需要一系列海尔和海信的产品,让他们各自生产自己相关对象。所以他的本质就是要创建一系列的产品。

public interface Refrigerator {

    public abstract void freeze(Food food);

    public abstract void desc();

}
public class HaierRefrigerator  implements Refrigerator {

    public void freeze(Food food) {

        System.out.println("食物: "+food.getFoodName());

        System.out.println("颜色: "+food.getColor());

        System.out.println("类型: "+food.getType());

    }



    public void desc() {

        System.out.println("海尔(Haier)BCD-258WDPM 258升 风冷无霜三门冰箱 除菌 3D立体环绕风不风干 中门5℃~-18℃变温室");

    }

}


public class HisenseRefrigerator  implements Refrigerator {

    public void freeze(Food food) {

        System.out.println("食物: "+food.getFoodName());

        System.out.println("颜色: "+food.getColor());

        System.out.println("类型: "+food.getType());

    }



    public void desc() {

        System.out.println("海信(Hisense)BCD-218D/Q 218升 三门冰箱 家用保鲜 节能静音 快速冷冻");

    }

}




public interface TV {

    public abstract void show(Movie movie);

    public abstract void feature();

}


public class HaierTV implements TV {

    public void show(Movie movie) {

        System.out.println("影片: " + movie.getMovieName());

        System.out.println("导演: " + movie.getDirector());

        System.out.println("评分: " + movie.getScore());

        System.out.println("地区: " + movie.getCountry());

    }



    public void feature(){

        System.out.println("海尔模卡(MOOKA)U55H3 55英寸 4K安卓智能网络纤薄窄边框UHD高清LED液晶电视");

    }

}


public class HisenseTV implements TV {

    public void show(Movie movie) {

        System.out.println("影片: " + movie.getMovieName());

        System.out.println("导演: " + movie.getDirector());

        System.out.println("评分: " + movie.getScore());

        System.out.println("地区: " + movie.getCountry());

    }



    public void feature(){

        System.out.println("海信(Hisense)LED55EC500U 55英寸 4K超高清 VIDAA4.0 智能电视 丰富影视教育资源 (黑色)");

    }

}


public interface AbstractFactory {

    public Refrigerator getRefrigerator();

    public TV getTV();

}


public class HaierFactory implements AbstractFactory {



    public Refrigerator getRefrigerator() {

        return new HaierRefrigerator();

    }



    public TV getTV() {

        return new HaierTV();

    }

}


public class HisenseFactory implements AbstractFactory {

    public Refrigerator getRefrigerator() {

        return new HisenseRefrigerator();

    }



    public TV getTV() {

        return new HisenseTV();

    }

}


public class Food {

    private String foodName;

    private String color;

    private String type;



    public Food() {

    }



    public Food(String foodName, String color, String type) {

        this.foodName = foodName;

        this.color = color;

        this.type = type;

    }



          // getter、setter

}


public class Movie {

    private String movieName;

    private String director;

    private float score;

    private String country;



    public Movie() {

    }



    public Movie(String movieName, String director, float score, String country) {

        this.movieName = movieName;

        this.director = director;

        this.score = score;

        this.country = country;

    }



    // getter 和 setter

}




public class Client {

    public static void main(String[] args) {

        AbstractFactory factory = new HaierFactory();

        Refrigerator refrigerator = factory.getRefrigerator();

        refrigerator.desc();

        Food food = new Food("五花肉","红色","肉类");

        refrigerator.freeze(food);





        TV tv = factory.getTV();

        tv.feature();

        Movie movie = new Movie("San Andreas","布拉德·佩顿",8.7F,"美国");

        tv.show(movie);



    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫言静好、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值