Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
一文搞懂工厂模式_生产模式包括哪些内容,希望能够帮助你!!!。
关于设计模式的思想,已经深入各种编程语言,其中工厂模式作为设计模式的一种,它的运用也相当广泛,本文重点阐述自己对工厂模式的理解,然后针对每一种工厂模式给出具体的业务场景。理解不当的地方,希望大家予以指正,谢谢!
工厂模式是一种创建者模式,用于封装和管理对象的创建,屏蔽了大量的创建细节,根据抽象程度不同,主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。
简单工厂模式是工厂模式最简单的体现,一般就是创建一个接口,这个接口代表一类产品,接口中一般封装的是产品的创建规范,然后有具体的产品呢去实现这个接口,相当于定义一些方法让它的实现类去实现。然后创建一个产品工厂,该工厂就是用来创建真正的具体的产品,创建完成后返回具体产品实例。
举例:
以生产手机为例
①手机是一类产品,包含多个品牌,所以这就可以定义为接口
public interface Phone{
//定义制造手机的方法 void make(); }
②假如要生产小米手机和苹果手机,这俩就相当于具体的产品
//小米手机 public Class MiPhone implements Phone{
public MiPhone() {
this.make(); } @Override public void make() {
System.out.println("小米手机制造"); } }
public Class ApplePhone implements Phone{
public ApplePhone() {
this.make(); } @Override public void make() {
System.out.println("制造苹果手机"); } }
③然后需要一个工厂来生产这些产品
//定义手机工厂生产手机 public class PhoneFactory {
//传入不同的手机型号 public Phone getVarietyPhone(String phoneType){
if (phoneType.equalsIgnoreCase("MiPhone")) {
return new MiPhone(); } if (phoneType.equalsIgnoreCase("ApplePhone")){
return new ApplePhone(); } return null; } }
以上接口和类各司其职,接下来就是客户端调测试了
public class TestSimpleFactory {
public static void main(String[] args) {
PhoneFactory phoneFactory = new PhoneFactory(); Phone miPhone = phoneFactory.getVarietyPhone("MiPhone"); Phone applePhone = phoneFactory.getVarietyPhone("ApplePhone"); } }
可以初步看出,用户并不知道手机的创建细节,就能得到所需的产品,而且简单工厂模式还只是简单封装了一下对象
假如我现在需要生产的手机不仅需要知道品牌,还需要知道老板姓名(=^=),那根据简单工厂的案例,我得在创建产品的时候增加参数,而且凡是涉及到的地方都要加,这样一来麻烦可想而知,能不能这样,索性不需要传什么参数了,直接就能返回具体产品实例呢?
工厂方法模式就是来解决这个问题的,采用一种多工厂的思路,为每一个产品都单独写个工厂,我们仍然使用生产手机为案例:
①首先就是要创建接口(同上)
②假如要生产小米手机和苹果手机,这俩就相当于具体的产品(同上)
③创建各自的工厂,注意;这里就是要创建多个工厂了
public class XiaoMiFactory implements AbstractFactory {
@Override public Phone makephone() {
return new MiPhone(); } }
public class AppleFactory implements AbstractFactory {
@Override public Phone makephone() {
return new ApplePhone(); } }
④把工厂进行抽象
public interface AbstractFactory {
Phone makephone(); }
⑤客户端测试
public class TestFactoryMethod {
public static void main(String[] arg) {
AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makephone(); // make xiaomi phone! appleFactory.makephone(); // make iphone! } }
可以看出工厂方法模式下,没有传参数,也一样生产出了产品,细节封装的更好了,更加灵活了。
但不难发现,第一种方式不够灵活,第二种方式灵活,但是好像有点点奇怪欸,我生产产品为啥要创建工厂,而且都只是在创建一类产品方面有所改进,那我现在如果想生产其他产品呢,这些接口,这些工厂就不够用了吧,所以继续改进!
抽象工厂模式就是首先把生产产品的工厂进行抽象,形成抽象工厂类,同时增加接口,有几种类型的产品就增加多少接口,这次以生产手机和电脑为例:
①创建产品接口
public interface Phone {
void make(); }
public interface PC {
void make(); }
②创建具体产品
i)手机
//小米手机 public Class MiPhone implements Phone{
public MiPhone() {
this.make(); } @Override public void make() {
System.out.println("小米手机制造"); } }
public Class ApplePhone implements Phone{
public ApplePhone() {
this.make(); } @Override public void make() {
System.out.println("制造苹果手机"); } }
ii)电脑
public class MAC implements PC {
public MAC() {
this.make(); } @Override public void make() {
System.out.println("make MAC!"); } }
public class MIPC implements PC {
public MIPC() {
this.make(); } @Override public void make() {
System.out.println("make xiaomi PC!"); } }
③创建具体工厂
public class AppleFactory implements AbstractFactory {
@Override public Phone makePhone() {
return new ApplePhone(); } @Override public PC makePC() {
return new MAC(); } }
public class XiaoMiFactory implements AbstractFactory {
@Override public Phone makePhone() {
return new MiPhone(); } @Override public PC makePC() {
return new MIPC(); } }
④抽象工厂的创建
public interface AbstractFactory {
Phone makePhone(); PC makePC(); }
⑤客户端测试
public class TestAbstractFactory {
public static void main(String[] arg) {
AbstractFactory miFactory = new XiaoMiFactory(); AbstractFactory appleFactory = new AppleFactory(); miFactory.makePhone(); // make xiaomi phone! miFactory.makePC(); // make xiaomi PC! appleFactory.makePhone(); // make iphone! appleFactory.makePC(); // make MAC! } }
这三种模式各有特点,所以各有应用场景,比如简单工厂模式适用创建的对象较少的情况。然后抽象工厂模式一般用于严格要求以面向对象思想进行开发的超大型项目中,我们一般常规的开发的话一般就是简单工厂和工厂方法模式会用的比较多一些。然后工厂方法模式比较灵活,所以需要依赖具体环境创建不同实例,这些实例都有相同的行为,这时候我们可以使用工厂方法模式,简化实现的过程,同时也可以减少每种对象所需的代码量,有利于消除对象间的耦合,提供更大的灵活性。简单理解,如有不当,欢迎大家批评指正!
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章